[英]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.