C的 进制转换 2--》16--》10 并且保存成 文件

遇见一个报错问题 ,是因为,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 文件
View Code
原文地址:https://www.cnblogs.com/mrguoguo/p/13741021.html