遇见一个报错问题 ,是因为,asc的空间不足 ,2进制 转换之后体积大了一倍,所以分配内存要x2
在单片机 中 如果 要存 的话,大于 u16 个字节无法写入必须分割写入才行
void Change(unsigned char * bin, size_t size, unsigned char * asc) { unsigned char* src = (unsigned char*)bin; unsigned char* dst = (unsigned char*)asc; while (size-- > 0) { *dst++ = tab[*src >> 4]; *dst++ = tab[*src & 0xF]; ++src; } } bool HexToInt(int* output, char* szInput) { //assert.... int cbInput = strlen(szInput); for (; cbInput > 0; cbInput--, szInput++) { char digit = szInput[0]; if (digit >= '0' && digit <= '9') digit = (digit - '0'); else if (digit >= 'A' && digit <= 'F') digit = (digit - 'A') + 10; else if (digit >= 'a' && digit <= 'f') digit = (digit - 'a') + 10; else return(false); *output = ((*output << 4) | digit); //虽然是十进制数,但是右移/或操作会自动转换为二进制进行 } return(true); }
这个是 stm32 U盘 保存 无法一次 全部写入 ,必须分成两段
sprintf((char*)tbuf, "3:DATA/FS_20%02d_%02d%02d_%02d%02d_%02d_%d_16.txt", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date, RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds, write_cnt); { u32 datalen = (u32)(TCP_SERVER_RX_BUFSIZE * 2); u16 datamax = 65535;//30000; OSSemPend(sem_process, 2000, &error); b = mf_open(tbuf, 7); u8* hex = mymalloc(SRAMEX, datalen); memset(hex, 0, datalen); for (u8 i = 0; i < MEM_DATA_LEN; i++) { u8* src = lwipData[i]; u8* dst = hex; u16 len = TCP_SERVER_RX_BUFSIZE; while (len-- > 0) { *dst++ = tab[*src >> 4]; *dst++ = tab[*src & 0xF]; ++src; } int s = 0; while (datalen > s) { if (datalen > s + datamax) { u8* temp = (u8*)mymalloc(SRAMEX,datamax); mymemcpy(temp, (hex)+s, datamax); c = mf_write(temp, datamax); s = s + datamax; myfree(SRAMEX, temp); } else { u8* temp = (u8*)mymalloc(SRAMEX, datalen - datamax); mymemcpy(temp, (hex)+s, (datalen - s)); c = mf_write(temp, (datalen - s)); s = datalen; myfree(SRAMEX, temp); } } //c = mf_write(" ", sizeof(" ")); mymemset(lwipData[i], 0, TCP_SERVER_RX_BUFSIZE); mymemset(hex, 0, TCP_SERVER_RX_BUFSIZE * 2); } myfree(SRAMEX, hex); //c = mf_write(lwipData, TCP_SERVER_RX_BUFSIZE); mf_close(); OSSemPost(sem_process); }
1 // temptest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include <iostream> 5 #include <fstream> 6 //#define TCP_SERVER_RX_BUFSIZE 41660 7 #define _CRT_SECURE_NO_WARNINGS 8 #pragma warning(disable:4996) 9 using namespace std; 10 #include<string.h> 11 #include <stdio.h> 12 #include <stdlib.h> 13 #define BUFFSIZE 4016*11*10 14 void p(void * data) { 15 /* a = malloc(100);*/ 16 for (size_t i = 0; i < BUFFSIZE /10; i++) 17 { 18 //printf("%s", &data[i]); 19 } 20 21 } 22 static char tab[] = "0123456789ABCDEF"; 23 24 void Change(unsigned char * bin, size_t size, unsigned char * asc) 25 { 26 27 unsigned char* src = (unsigned char*)bin; 28 unsigned char* dst = (unsigned char*)asc; 29 while (size-- > 0) 30 { 31 *dst++ = tab[*src >> 4]; 32 *dst++ = tab[*src & 0xF]; 33 ++src; 34 } 35 } 36 37 38 bool HexToInt(int* output, char* szInput) 39 { 40 //assert.... 41 int cbInput = strlen(szInput); 42 for (; cbInput > 0; cbInput--, szInput++) 43 { 44 char digit = szInput[0]; 45 if (digit >= '0' && digit <= '9') digit = (digit - '0'); 46 else if (digit >= 'A' && digit <= 'F') digit = (digit - 'A') + 10; 47 else if (digit >= 'a' && digit <= 'f') digit = (digit - 'a') + 10; 48 else return(false); 49 50 *output = ((*output << 4) | digit); //虽然是十进制数,但是右移/或操作会自动转换为二进制进行 51 } 52 return(true); 53 } 54 55 int gettoken(char* pszsrc, char* pszsplit, char* pszdest) 56 { 57 int ipos; 58 char* pptr = NULL; 59 pptr = strstr(pszsrc, pszsplit); 60 if (pptr) 61 { 62 ipos = strlen(pszsrc) - strlen(pptr); 63 strncpy(pszdest, pszsrc, ipos); 64 strcpy(pszsrc, pptr+ strlen(pszsplit)); 65 //pszdest[ipos] = ' '; 66 } 67 else 68 { 69 ipos = strlen(pszsrc); 70 strncpy(pszdest, pszsrc, ipos); 71 //pszdest[ipos] = ' '; 72 //pszsrc[0] = ' '; 73 return 0; 74 } 75 return 1; 76 } 77 78 int main() 79 { 80 81 #pragma region 每次最大写入65535 82 83 84 //u32 datalen = (u32)(TCP_SERVER_RX_BUFSIZE * 2); 85 //u16 datamax = 65535;//30000; 86 //int s = 0; 87 //while (datalen > s) 88 //{ 89 // if (datalen > s + datamax) 90 // { 91 // u8* temp = (u8*)mymalloc(SRAMEX, datamax); 92 // mymemcpy(temp, (hex)+s, datamax); 93 // c = mf_write(temp, datamax); 94 // s = s + datamax; 95 96 // myfree(SRAMEX, temp); 97 // } 98 // else 99 // { 100 // u8* temp = (u8*)mymalloc(SRAMEX, datalen - datamax); 101 // mymemcpy(temp, (hex)+s, (datalen - s)); 102 103 // c = mf_write(temp, (datalen - s)); 104 // s = datalen; 105 // myfree(SRAMEX, temp); 106 // } 107 108 //} 109 110 #pragma endregion 111 112 char *str = "This is - www.runoob.com - website"; 113 const char s[2] = "-"; 114 char* token; 115 116 /* 获取第一个子字符串 */ 117 token = strtok(str, s); 118 119 /* 继续获取其他的子字符串 */ 120 while (token != NULL) { 121 printf("%s ", token); 122 123 token = strtok(NULL, s); 124 } 125 126 127 //char *s = (char* )"abcdef"; 128 129 //char ss[2] = {}; 130 131 //char * m1 = strstr(s,"de"); 132 133 //strncpy(ss,s+2,2); 134 //memcpy(ss,s+1,1); 135 136 FILE* filestr = fopen("FS_2020_0925_1241_45_12.txt", "rb"); 137 //unsigned char buff[BUFFSIZE]; 138 // unsigned char buff2[BUFFSIZE]; 139 unsigned char *buff=nullptr; 140 unsigned char *buff2 = nullptr; 141 buff = (unsigned char *)malloc(BUFFSIZE); 142 buff2 = (unsigned char*)malloc(BUFFSIZE*2); 143 int count = 0; 144 int errnor = 0; 145 146 memset(buff, 0, BUFFSIZE); 147 //char ptemp[BUFFSIZE]; 148 memset(buff2, 0, BUFFSIZE*2); 149 int a = 0; 150 while (!feof(filestr)) { 151 count = fread(buff, sizeof(char), BUFFSIZE, filestr); 152 if (count > 0) 153 { 154 Change(buff, BUFFSIZE, buff2); 155 } 156 157 int a2 = 0; 158 159 char* m3 = strtok((char*)buff2,"F5A6"); printf("%s", m3); 160 char* m2 = strstr((char *)buff2,"F5A6"); 161 162 while (m2) 163 { 164 a2++; 165 166 167 168 m2 = strncpy(m2,m2+32,strlen(m2)-32); 169 m2 = strstr((char*)buff2, "F5A6"); 170 printf("%d", a2); 171 } 172 173 174 //memcpy(buff2+a*BUFFSIZE,ptemp , BUFFSIZE); 175 a++; 176 //char* p = strtok(ptemp, "F5A6"); 177 // 178 //while (p!=NULL) 179 //{ 180 // a++; 181 // p = strtok(NULL, p); 182 // //printf("%x ", 0); 183 //} 184 printf("%d ", a); 185 int n = feof(filestr); 186 //printf("%d,%d ", count, n); 187 //printf("%s ", strerror(errnor)); 188 } 189 free(buff); 190 free(buff2); 191 fclose(filestr); 192 return 0; 193 // uint32_t a = 0; 194 //uint8_t tcp_server_recvbuf[TCP_SERVER_RX_BUFSIZE]; //TCP客户端接收数据缓冲区 195 //uint8_t tcp_server_recvbuf2[TCP_SERVER_RX_BUFSIZE]; 196 197 //memset(tcp_server_recvbuf, 0, TCP_SERVER_RX_BUFSIZE); 198 //memset(tcp_server_recvbuf2, 0, TCP_SERVER_RX_BUFSIZE); 199 //for (size_t i = 0; i < TCP_SERVER_RX_BUFSIZE; i++) 200 //{ 201 // tcp_server_recvbuf[i] = i%255; 202 //} 203 //memcpy(tcp_server_recvbuf2, tcp_server_recvbuf, TCP_SERVER_RX_BUFSIZE); 204 ///*while (true) 205 //{ 206 // a++; 207 //}*/ 208 209 //printf("666"); 210 ////for (size_t i = 0; i < TCP_SERVER_RX_BUFSIZE; i++) 211 ////{ 212 //// printf("%s", &tcp_server_recvbuf2[i]); 213 ////} 214 //p(tcp_server_recvbuf2); 215 216 217 218 219 //char ** lwipData; 220 //int i, j; 221 //int n=10; 222 //int m = 5; 223 ////sclwipDatanf("%d", &n); 224 //lwipData = (char**)malloc(sizeof(char*) * n);//为二维数组分配n行 225 //for (i = 0; i < n; i++) 226 //{ 227 // //为每列分配n个整型大小空间 228 // lwipData[i] = (char*)malloc(sizeof(char) * m); 229 //} 230 //for (i = 0; i < n; i++) 231 //{ 232 // for (j = 0; j < m; j++) 233 // { 234 // lwipData[i][j] = 0; 235 // } 236 //} 237 // 238 //char b[] = {1,2,3,4,5}; 239 240 //for (size_t i = 0; i < n; i++) 241 //{ 242 // memcpy(lwipData[i], b, m*sizeof(char)); 243 //} 244 245 //for (i = 0; i < n; i++) 246 //{ 247 // for (j = 0; j < m; j++) 248 // { 249 // printf("%2d", lwipData[i][j]); 250 // } 251 // printf(" "); 252 //} 253 //FILE* filestr = fopen("my.txt","wb"); 254 //for (size_t i = 0; i < n; i++) 255 //{ 256 // for (j = 0; j < m; j++) 257 // { 258 // fprintf(filestr, "%d",lwipData[i][j]); fprintf(filestr, " "); 259 // } 260 // fprintf(filestr, " "); 261 //} 262 //fclose(filestr); 263 264 265 266 267 268 269 270 271 std::cout << "Hello World! "; 272 } 273 274 275 // 276 //#define MAX 50 277 //int _2to16(char &elem2)//二转十六 278 //{ 279 // 280 // //char *elem2=&p; 281 // int flag = 1; 282 // char ch; 283 // int i = 0; 284 // while (flag) 285 // { 286 // cin >> ch; 287 // if (ch != '$') 288 // { 289 // elem2[i] = ch; 290 // i++; 291 // } 292 // else 293 // { 294 // flag = 0; 295 // } 296 // } 297 // int length = i; 298 // int n = 0; 299 // int sum = 0; 300 // int product = 0; 301 // if (length % 4 != 0)//将缺位的二进制码用0补齐 302 // { 303 // int n = 4 - length % 4; 304 // int i = 0; 305 // for (i = length - 1; i >= 0; i--) 306 // elem2[i + n] = elem2[i]; 307 // length += n; 308 // for (i = 0; i < n; i++) 309 // elem2[i] = '0'; 310 // cout << "补齐之后的内容是:" << endl; 311 // for (i = 0; i < length; i++) 312 // cout << elem2[i] << " "; 313 // cout << endl; 314 // } 315 // for (n = 0; n < length; n++)//判断是否是二进制数 316 // { 317 // if ('1' == elem2[n] || '0' == elem2[n]) 318 // sum++; 319 // } 320 // if (sum == length) 321 // { 322 // char elem16[MAX]; 323 // int r = 0; 324 // int m = 0; 325 // int p = 0; 326 // int q = 0; 327 // for (m = length - 1; m >= 0; m--) 328 // { 329 // q = elem2[m] - '0'; 330 // product += q * pow(2, p); 331 // p++; 332 // if (4 == p) 333 // { 334 // if (product > 9) 335 // elem16[r] = product + 55;//输出A...F范围 336 // else 337 // { 338 // elem16[r] = product + 48;//输出0...9范围 339 // } 340 // r++; 341 // p = 0; 342 // product = 0; 343 // } 344 // } 345 // int j = 0; 346 // cout << "对应的十六进制数是:OX"; 347 // for (j = r - 1; j >= 0; j--) 348 // cout << elem16[j]; 349 // cout << endl; 350 // 351 // } 352 // else 353 // { 354 // cout << "你输入的不是二进制数!" << endl; 355 // } 356 // return 0; 357 //} 358 //// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 359 // 调试程序: F5 或调试 >“开始调试”菜单 360 361 // 入门使用技巧: 362 // 1. 使用解决方案资源管理器窗口添加/管理文件 363 // 2. 使用团队资源管理器窗口连接到源代码管理 364 // 3. 使用输出窗口查看生成输出和其他消息 365 // 4. 使用错误列表窗口查看错误 366 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 367 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件