我正在使用此代码:
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
中重构整数?
答案 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)
这仅适用于32位(4字节)整数。如果要支持大型int,则必须编写64位(8字节)版本。
您可以使用按位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);
作为旁注,如果您仅为同一设备序列化数据,则可以将number
发送给sendBuffer
。
memcpy(sendBuffer, &number, sizeof(number));
memcpy(sendBuffer+sizeof(number), &number1, sizeof(number1));