数据传输转化

在数据传输过程中,经常要将int 型数据转化成char 型数据, 我经常使用的是 union和结构体,具体定义如下:

typedef union
{
    struct{
        unsigned char low;
        unsigned char secLow;
        unsigned char hight;
        unsigned char secHight;
    }intBit;
    int value;
}intCoverChar;

使用的时候 int 转化 char 型数组 小端模式

    char data[4] = {0};
    intCoverChar mData;
    mData.value =100;//00 00 00 64
    data[0] = mData.intBit.low;
    data[1] = mData.intBit.secLow;
    data[2] = mData.intBit.hight;
    data[3] = mData.intBit.secHight;

使用printf 打印

    printf("%p\n",data);
    printf("%p\n",data+1);
    printf("%p\n",data+2);
    printf("%p\n",data+3);


    printf("%x\n",*data);
    printf("%x\n",*(data+1));
    printf("%x\n",*(data+2));
    printf("%x\n",*(data+3));

打印出的地址和数据为

如果本机是小端模式在内存中结构体的存放数据的地址是从 地位到高位比如上面结构体low的地址为0xbfad1708 seclow即为0xbfad1709 hight的地址为 0xbfad170a secHight的地址为0xbfad170b。数组在内存中的是一块连续的递增的地址,所以如果按照大端的方式往数组里面放为

    char data[4] = {0};
    intCoverChar mData;
    mData.value =100;//00 00 00 64
    data[0] = mData.intBit.hight;
    data[1] = mData.intBit.secHight;
    data[2] = mData.intBit.low;
    data[3] = mData.intBit.secLow;

即 将高位放在数组地位,地位放在数组高位

如果将value值改成 500 按照小端模式的放入 在打印的时候会出现如下的情况

fffffff4
1
0
0

这是因为一个char 能表示的最大的数为128-1 最高位为符号位,所有要进行扩位 在前面补位补1. 解决这种问题的办法为将数组声明为unsigned char

一个字节是8个二进制位
能表示的最大的无符号数为:2^8-1=256-1=255
能表示的最大的有符号数为:2^7-1=128-1=127

发表评论

电子邮件地址不会被公开。