在字节数组中嵌入多个整数
Embed multiple ints in byte array
我正在使用以下代码:
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
中。
我的问题是:
假设我现在想在字节数组中嵌入两个数字,我应该这样做吗?
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;
即使大小为 8 或 6 字节,
number
也能正常工作吗?(我之所以这样说,是因为在某些平台上,int 可能是 4 个字节或 6 个字节,对吧?所以我在想当数字为 6 字节时,上面的代码是否也有效?进一步需要注意的是,即使它是 6 个字节,但我只在其中存储 4 个字节整数,上面的代码会起作用吗?这个缓冲区我通常存储在卡的一些内存中,我读回它没有问题(例如,endiannes 等问题,读取时的字节数组似乎按照我保存的顺序出现)。
最后,如何从字节数组
sendBuffer
重建整数?
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];
-
这仅适用于 32 位(4 字节)整数。如果要支持大整数,则必须编写 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
memcpy sendBuffer
.
memcpy(sendBuffer, &number, sizeof(number));
memcpy(sendBuffer+sizeof(number), &number1, sizeof(number1));
即使数字的大小为 8 或 6 个字节,这也能工作吗?
它可以工作,但显然您需要添加更多行来保存值中的所有字节。这是大量的手动工作,可扩展性不强。请改用编程方法
auto num = number;
for (size_t i = 0; i < sizeof(number); i++, num >>= CHAR_BIT)
sendBuffer[i] = number & 0xFF;
但是,当您已经拥有memcpy()
时,为什么要这样做呢?这样您只需要 1 行,甚至更好,它可以轻松地扩展到多个值
memcpy(&sendBuffer[0], number1, sizeof number1);
memcpy(&sendBuffer[sizeof(number1)], number2, sizeof number2);
最后,如何从字节数组sendBuffer重建整数?
容易。只需将字节移回即可
number = (sendBuffer[3] << 24) | (sendBuffer[2] << 16) | (sendBuffer[1] << 8) | sendBuffer[0];
number2 = (sendBuffer[7] << 24) | (sendBuffer[6] << 16) | (sendBuffer[5] << 8) | sendBuffer[4];
同样,避免像这样乏味的工作并使用for
循环
number = 0;
for (size_t i = 0; i < sizeof(number); i++)
number = (number << 8) | sendBuffer[i];
但memcpy
也有效,强烈推荐
memcpy(&number, &sendBuffer[numberIndex], sizeof number);
- std::当在256字节边界上写入整数时,流的奇怪行为
- C++字节数组到整数
- Qt:从固定数量的字节到整数
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- 什么是 16 字节有符号整数数据类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 我如何将整数转换为存储在字符阵列中的十六进制字节
- 计算表示有符号整数所需的最小字节数
- 如何从从 MPU 陀螺仪发送的字节数组中获取整数
- 将字节数组转换为逗号分隔的整数字符串
- 将整数解释为字节数组的安全性
- C++ 如何将 char[] 中的多个字节转换为一个整数
- 字节或整数地址预期,而不是str实例python 3
- 如何在不使用循环的情况下将低字节和高字节的字符数组转换为它们的整数数组
- 将整数从处理发送到Arduino,无法读取字节
- C 2字节阵列计算(char阵列,字符串和整数)
- 从文件到短 /长整数读取字节
- C 如何将字节读取为整数enderness独立