我有整数的缓冲区/有效载荷,其中每4个字节是我需要提取的字段。 我有一个指向缓冲区的指针。现在我必须提取4个字节并将其分配给变量,直到达到缓冲区末尾。 指针是uint8_t指向buf的指针,buf是其封装细节的缓冲区对象。 什么是最好的和最优雅的方式来做到这一点? 我在C++中编码。任何建议表示赞赏。如何从整数的缓冲区中提取4个字节的整数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));
BTW:确保你没有存在问题(例如,您的机器和保存这些整数的机器必须具有相同的字节序才能工作,否则您需要进行补偿)。你在这里依赖于你特定的C++实现。
假设如果担心endianess,你可以使用已建立的函数之一进行转换:'value = ntohl(*(reinterpret_cast
'ntohl'和'htonl'用于在给定的机器和标准网络约定之间进行转换。如果数据可能来自保存在另一台计算机上的二进制文件,那么只有当保存者和读者一致使用它们时,这些数据才有用。 – Kos
非常真实。我想,OP需要更多的信息。 –
你可以做到这一点,如下用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);
}
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);});
我会建议读出字节一个接一个,和“手动”组装的数量。这要求你清楚预期的字节顺序,这是一件好事。由于您从缓冲区读取的所有内容都是字节,因此它还可以使代码更好地满足任何对齐要求。
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;
}
可以做到这一点,如下使用的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++];
- 1. 从缓冲区内容中提取整数/数字
- 2. 复制整数缓冲区如果缓冲区在C
- 3. Python:如何从一个4字节的字节数组中获取一个4字节大小的整数?
- 4. 阅读整数从缓冲区到C中的数组
- 5. 解析整数缓冲区
- 6. C整数到缓冲区RFC 4506
- 7. 如何在iOS中将缓冲区中的大整数读入整数?
- 8. C中的整数字节#
- 9. 调整大小从缓冲区JPEG到另一个缓冲区
- 10. 如何提取4个字节的32位整型在Lua
- 11. 如何在从C++中的bytearray中提取字节时交换64位整数?
- 12. 从缓冲区中提取字符串
- 13. 如何从Expect缓冲区字符串中提取某个数字?
- 14. 如何提取从C字符串++的整数数组
- 15. 如何估计从NetworkStream中读取的字节数组/缓冲区的大小?
- 16. 将缓冲区中的整数和左边的缓冲区置零?
- 17. 如何从rails中的字符串中提取多个整数
- 18. 从一个字符串中提取整数 - 包括负整数
- 19. 的memcpy整数缓冲
- 20. 如何用C#中的TCP Client读取整个输入缓冲区?
- 21. C++ - 从缓冲区读取数据
- 22. Python整数到只读缓冲区
- 23. TypeError:缓冲区需要整数
- 24. 套接字编程:如何从缓冲区读取指定数量的字节?
- 25. 如何从3位整数中提取单个数字?
- 26. 如何从整数中提取单个数字
- 27. 从数字中提取整数
- 28. 如何从指针读取字符串缓冲区中的C#
- 29. 如何在Vim的整个缓冲区中应用新的textwidth
- 30. 如何将数据从缓冲区放入C中的数组?
你的意思是你有一个整数或字节数组的数组,你要转换为整数? – Andrew
uint8_t指向buf的指针。 buf一个缓冲区对象,而不是一个数组 – Nikhil
什么是缓冲区对象呢? – Andrew