簡體   English   中英

如何從C ++中的整數緩沖區中提取4個字節的整數

[英]How to Extract 4 bytes of integer from a buffer of integers in c++

我有整數的緩沖區/有效載荷,其中每4個字節是我需要提取的字段。 我有一個指向緩沖區的指針。 現在,我必須提取4個字節並將其分配給變量,直到到達緩沖區末尾。 指針是指向buf的uint8_t指針,而buf是其詳細信息已封裝的緩沖區對象。 最好和最優雅的方法是什么? 我在用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;
}

如果緩沖區中的整數是字對齊的,則可以嘗試:

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

順便說一句:確保您沒有字節序問題(即您的機器和保存這些int的機器必須具有相同的字節序才能正常工作,否則您需要進行補償)。 您在這里依賴於C ++的特定實現。

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代碼如下進行操作:

我指出要從中讀取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++];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM