如何在 c++ 中从整数缓冲区中提取 4 个字节的整数
How to Extract 4 bytes of integer from a buffer of integers in c++
我有整数的缓冲区/有效负载,其中每 4 个字节是我需要提取的字段。我有一个指向缓冲区的指针。现在我必须提取 4 个字节并将其分配给变量,直到到达缓冲区的末尾。指针是指向 buf uint8_t指针,buf 是封装其详细信息的缓冲区对象。这样做最好和最优雅的方法是什么?我正在用 c++ 编码。任何建议不胜感激。
如果缓冲区中的整数是字对齐的,您可以尝试:
const char* ptr; // this points to a position in a buffer
int value = reinterpret_cast<int*>(ptr);
否则,也许更安全、更可取:
const char* ptr;
int value;
std::copy(ptr, ptr+sizeof(int), reinterpret_cast<char*>(value));
顺便说一句:确保你没有恩迪亚特性的问题(即你的机器和保存这些整数的机器必须具有相同的恩迪亚特性才能工作,否则你需要补偿)。您在此处依赖于C++的特定实现。
您可以使用 C 代码执行以下操作:
int i = 0;
int value;
while(i < buffersize)
{
value = 0;
memcpy(&value, buffer, sizeof(int));
//if the buffer is from network, then you may have to do a conversion from network order to host order here
printf("%d", value);
buffer = buffer + sizeof(int);
i = i + sizeof(int);
}
我建议逐个读出字节,并"手动"组装数字。这需要您清楚预期的字节序,这是一件好事。它还使代码适合任何对齐要求,因为您从缓冲区读取的只是字节。
uint32_t extract_uint32_be(const uint8_t *buffer)
{
const uint8_t b0 = buffer[0], b1 = buffer[1], b2 = buffer[2], b3 = buffer[3];
return (b0 << 24) | (b1 << 16) | (b2 << 8) | b3;
}
assert(buf_bytes % 4 == 0);
std::vector<uint32_t> numbers(buf_bytes/4);
memcpy(&numbers[0], buf, buf_bytes);
if (need_byte_swap)
std::for_each(numbers.begin(), numbers.end(), [](uint32_t &n){ntohl(n);});
强制转换为 4 字节整数和索引的数组。
要么一次读取一个字节并将它们移位/添加到 int 中,要么使用 memcpy 将字节复制到正确类型的变量中。 std::copy 也可能是可以接受的,我不确定别名的规则。
按照建议强制转换为数组可能会破坏严格的混叠规则,因此不能保证正常工作,并且可能是未定义的行为。
您可以使用 C 代码执行以下操作:
i 指向要从中读取 4 个字节的缓冲区。
read = (UInt32)((UInt8*)p_msg)[i++] << 24;
read |= (UInt32)((UInt8*)p_msg)[i++] << 16;
read |= (UInt32)((UInt8*)p_msg)[i++] << 8;
read |= (UInt32)((UInt8*)p_msg)[i++];
相关文章:
- std::当在256字节边界上写入整数时,流的奇怪行为
- C++字节数组到整数
- Qt:从固定数量的字节到整数
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- 什么是 16 字节有符号整数数据类型?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- 将整数向量转换为字节数组向量,然后调用每个字节数组
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 我如何将整数转换为存储在字符阵列中的十六进制字节
- 计算表示有符号整数所需的最小字节数
- 如何从从 MPU 陀螺仪发送的字节数组中获取整数
- 将字节数组转换为逗号分隔的整数字符串
- 将整数解释为字节数组的安全性
- C++ 如何将 char[] 中的多个字节转换为一个整数
- 字节或整数地址预期,而不是str实例python 3
- 如何在不使用循环的情况下将低字节和高字节的字符数组转换为它们的整数数组
- 将整数从处理发送到Arduino,无法读取字节
- C 2字节阵列计算(char阵列,字符串和整数)
- 从文件到短 /长整数读取字节
- C 如何将字节读取为整数enderness独立