如何从c ++中的整数缓冲区中提取4个字节的整数

时间:2012-06-21 08:55:20

标签: c++ c

我有整数的缓冲区/有效负载,其中每4个字节是我需要提取的字段。 我有一个指向缓冲区的指针。现在我必须提取4个字节并将其分配给变量,直到我到达缓冲区的末尾。 指针是指向buf的uint8_t指针,buf是一个缓冲对象,其详细信息被封装。 这样做的最佳和最优雅的方法是什么? 我用c ++编写代码。任何建议表示赞赏。

7 个答案:

答案 0 :(得分:2)

您可以使用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);
}

答案 1 :(得分:2)

我建议逐个读出字节,然后“手动”汇编数字。这需要你清楚预期的字节序,这是一件好事。它还可以使代码很好地满足任何对齐要求,因为从缓冲区读取的所有内容都是字节。

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;
}

答案 2 :(得分:1)

如果缓冲区中的整数是字对齐的,您可以尝试:

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));

顺便说一句:确保你没有关于endianess的问题(即你的机器和保存这些int的机器必须具有相同的endianess才能工作,否则你需要补偿)。你在这里依赖于你特定的C ++实现。

答案 3 :(得分:1)

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 :(得分:0)

转换为4字节整数和索引的数组。

答案 5 :(得分:0)

一次读取一个字节并将它们移位/添加到int中或使用memcpy将字节复制到正确类型的变量中。 std :: copy也可以接受,我不确定别名的规则。

根据建议投射到数组可能会破坏严格的别名规则,因此无法保证工作,并且可能是未定义的行为。

答案 6 :(得分:0)

您可以使用C代码执行以下操作:

我指向要从中读取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++];