• C语言字节数组转换为基本数据类型


    首先,必须明确基本类型在不同环境下字节的大小

    这里用到了unsigned char:1  int:4  double:8

    自己主要想用的是将字节数组转换为int型,double型

    具体来说,将接收到的4字节数组数据转换为int型

                 将接收到的8字节数组数据转换为double型

    java中有大量的函数可直接利用,C语言只能自己写了,主要用到了<string.h>中的memcpy函数

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {   
        
        int i;
        int result_src=1246;
        unsigned char message[4];
        int result_dst;
        double money_src=200.00;
        unsigned char s[8];
        double money_dst;
        //={0XDe,0X04,0,0};
           printf("unsigned char:%d  int:%d  double:%d
    ",sizeof(unsigned char),sizeof(int),sizeof(double));
           printf("
    正变换---将int型数据转换为4字节数组:
    ");
        memcpy(message,&result_src,sizeof(int));
            for(i=0;i<4;i++)
            {
             printf("%x ",message[i]);
            } 
             printf("
    逆变换---将4字节数组转换为int型数据:
    ");  
            result_dst=message[0]+(message[1]<<8)+(message[2]<<16)+(message[3]<<24);
           // memcpy(&result_dst,message,sizeof(int)); 
            printf("%d ",result_dst);
      
        printf("
    ------------------------");
          
          printf("
    正变换---将double型数据转换为8字节数组:
    ");
          memcpy(s,&money_src,sizeof(double));
          //显示 
           for(i=0;i<8;i++)
            {
             printf("%x ",s[i]);
            } 
         printf("
    逆变换---将8字节数组转换为double型数据:
    ");  
         memcpy(&money_dst,s,sizeof(double)); 
         //显示 
         printf("%f 
    ",money_dst);
        system("pause");
        return 0;
    }

    将接收到的4字节数组数据转换为int型:

    两种方法:1,移位   2.利用memcpy

    result_dst=message[0]+(message[1]<<8)+(message[2]<<16)+(message[3]<<24);

    将接收到的8字节数组数据转换为double型

     利用memcpy

    我们可以看到通过使用mempy既可以将基本数据转换为字节数组,亦可以将字节数组转换为基本数据类型,唯一需要注意的是位数问题

    附注:(当出现大小端问题,解决思路)

    C/C++中,直接进行内存拷贝就可以了:

    1
    2
    3
    4
    BYTE s[8];
    memcpy(s,money,sizeof(double));
    int intMoney = (int)(money*10);
    memmove(s,intMoney,sizeof(int));

    需要注意的是根据使用逻辑,如果需要字节逆序(这个很奇怪,因为通常是int类型需要)还是要做之后那个循环。另外就是数据类型了,double是8字节的格式存储,int是4字节逆序存储。




  • 相关阅读:
    ListView之setEmptyView的问题
    AdapterView的相关知识。
    分享一个程序猿的真实的爱情故事
    C#中的explicit和implicit了解一下吧
    通俗易懂,什么是.NET Core以及.NET Core能做什么
    目前下载VS2017你可能会遇到这个坑
    .NET Core中使用Dapper操作Oracle存储过程最佳实践
    分享一个.NET平台开源免费跨平台的大数据分析框架.NET for Apache Spark
    从ASP.NET Core2.2到3.0你可能会遇到这些问题
    What?VS2019创建新项目居然没有.NET Core3.0的模板?Bug?
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/5220922.html
Copyright © 2020-2023  润新知