在字节数组中嵌入多个int

时间:2013-09-24 09:04:19

标签: c++

我正在使用此代码:

int number; //=smth
unsigned char sendBuffer[255];
sendBuffer[0] = number & 0xFF;
sendBuffer[1] = (number  >> 8) & 0xFF;
sendBuffer[2] = (number  >> 16) & 0xFF;
sendBuffer[3] = (number  >> 24) & 0xFF;

number放入字节数组sendBuffer

我的问题是:

1)假设我想在字节数组中嵌入两个数字,我会这样继续吗?

    sendBuffer[0] = number & 0xFF;
    sendBuffer[1] = (number  >> 8) & 0xFF;
    sendBuffer[2] = (number  >> 16) & 0xFF;
    sendBuffer[3] = (number  >> 24) & 0xFF;
    sendBuffer[4] = number2 & 0xFF;
    sendBuffer[5] = (number2  >> 8) & 0xFF;
    sendBuffer[6] = (number2  >> 16) & 0xFF;
    sendBuffer[7] = (number2  >> 24) & 0xFF;

即使 number 大小为8或6个字节,这是否也能正常工作? (我这样说是因为在某些平台上int可能是4个字节或6个对吗? 所以我在想,如果数字是6个字节,上面的代码是否也能正常工作? 还需要注意的是,即使它是6个字节,但我只是 在其中存储4字节整数,上面的代码会工作吗?)。

这个缓冲区我通常存储在卡的某些内存中,我没有阅读的问题 它返回(例如,endiannes等问题,读取时的字节数组似乎按照我保存的顺序出现)。

2)最后,如何从字节数组sendBuffer中重构整数?

3 个答案:

答案 0 :(得分:1)

1)是的,继续这样做。不,它只适用于4个字节。

有一种更简单,更好的方法,但如果缓冲区从一台计算机发送到另一台使用不同架构的计算机,则会导致字节序问题。假设您知道number的类型,请在sendBuffer之上叠加另一个数组。

unsigned char sendBuffer[255];
number_type *sendBufferNum = (number_type*) sendBuffer;
sendBufferNum[0] = number;
sendBufferNum[1] = number2;

读取数字可以用同样的方式完成。

unsigned char receiveBuffer[255];
//read values into receiveBuffer
number_type *receiverBufferNum = (number_type*) receiveBuffer;
number_type number = recieveBuffer[0];
number_type number2 = receiveBuffer[1];

答案 1 :(得分:0)

1)问题不是很清楚。这取决于您在number上存储的内容。当然,如果您只是保存4个低字节,那么更高的字节将丢失。对于任何其他尺寸,您需要稍微更改代码

2)只需将字节移回

number  = (sendBuffer[3] << 24) | (sendBuffer[2] << 16) | (sendBuffer[1] < 8) | sendBuffer[0];
number2 = (sendBuffer[7] << 24) | (sendBuffer[6] << 16) | (sendBuffer[5] < 8) | sendBuffer[4];

答案 2 :(得分:0)

  1. 这仅适用于32位(4字节)整数。如果要支持大型int,则必须编写64位(8字节)版本。

  2. 您可以使用按位OR来反转该过程。

    #define BigEndianGetUInt32(ptr)  ( ((uint32)((uint8*)(ptr))[0]) << 24 | \  
                                       ((uint32)((uint8*)(ptr))[1]) << 16 | \  
                                       ((uint32)((uint8*)(ptr))[2]) <<  8 | \  
                                        (uint32)((uint8*)(ptr))[3]) )
    number  = BigEndianGetUInt32(sendBuffer);
    number1 = BigEndianGetUInt32(sendBuffer+4);
    
  3. 作为旁注,如果您仅为同一设备序列化数据,则可以将number发送给sendBuffer

    memcpy(sendBuffer, &number, sizeof(number));
    memcpy(sendBuffer+sizeof(number), &number1, sizeof(number1));