簡體   English   中英

如何正確地將無符號字符數組轉換為 uint32_t

[英]How to properly convert an unsigned char array into an uint32_t

因此,我正在嘗試將unsigned char數組轉換為uint32_t ,但每次都會得到不同的結果:

unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};;
uint32_t num = (uint32_t*)&buffer;

現在,我不斷收到此警告:

警告:初始化使 integer 從沒有強制轉換的指針

當我將num更改為*num時,我沒有收到該警告,但這實際上不是真正的問題(更新:好吧,現在我想到這些可能是相關的。),因為每次我運行代碼時都有不同結果 其次num ,一旦正確轉換,應該是128 ,但是如果我需要更改緩沖區的字節順序,我可以自己設法做到這一點,我認為.

謝謝!

你試過這個嗎?

num = (uint32_t)buffer[0] << 24 |
      (uint32_t)buffer[1] << 16 |
      (uint32_t)buffer[2] << 8  |
      (uint32_t)buffer[3];

這樣你就可以控制字節順序等等。

投射一個char指針並將其解釋為更大的東西真的不安全。 一些機器期望指向整數的指針是對齊的。

cnicutar 的答案是最好的假設你想要一個特定的固定字節序。 如果您想要主機端,請嘗試:

uint32_t num;
memcpy(&num, buffer, 4);

或將ntohl應用於 cnicutar 的答案。 任何基於類型雙關語的方法都是錯誤和危險的。

首先,你想說num = *(uint32_t *)&buffer

要更改字節順序,您可以使用 bswap_32(在 linux,byteswap.h 中)或 OSSwapInt64(在 osx,libkern/OSByteOrder.h 中)之類的調用

發出警告是因為&buffer產生一個指向指針的指針。 即使沒有引用運算符&警告也不會消失,因為轉換僅更改指針類型。 指針進一步轉換為 integer 並因此發出警告。

如果字節序不重要,那么在我看來,顯而易見的解決方案

unsigned char buffer[] = {0x80, 0x00, 0x00, 0x00};
uint32_t num = *(uint32_t *)buffer;

這意味着取消對 char 數組的強制轉換指針的引用。

借用@ R 先生。 以上,我將結構中的 3 字節大端無符號字符數組轉換為小端無符號整數的方法...

struct mystruct {
  int stuff;
  int stuff2;
  unsigned char x[3]    // big endian
} 
mystruct z;
unsigned int y  // little endian

memcpy(&y, z->x, 3);
y=be32toh(y<<8);`

假設它是相同的字節序,工會將是最好的選擇。

union
{
    uint32_t u32;
    float flt;  
    uin8_T bytes[4];

} converter;

// 使用上述聯合

converter.bytes = your_byte_array;
uint32_t u32_output = converter.u32;
float float_output = converter.flt;

暫無
暫無

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

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