zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    推销员问题
    string类实现
    链表倒数第k个节点
    设计模式之单例模式大全
    空类 sizeof 为什么是1
    类的三种继承方式
    单例模式典型创建方法(三种)
    虚函数实现
    链表删除结点
    TCP的状态转移
  • 原文地址:https://www.cnblogs.com/mrguoguo/p/13741021.html
Copyright © 2011-2022 走看看