zoukankan      html  css  js  c++  java
  • 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字节逆序存储。




  • 相关阅读:
    Lock和synchronized的区别和使用(转发)
    redis集群配置
    分布式之redis(转发)
    拉格朗日乘法与KKT条件
    骨骼动画原理
    常用非线性优化算法总结
    广义线性回归模型(三)
    线性模型、最优化方法(二)
    矩阵微分基础(一)
    OpenGL坐标系统
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/5220922.html
Copyright © 2011-2022 走看看