簡體   English   中英

將uint8_t [4]轉換為unsigned long

[英]Converting uint8_t[4] to unsigned long

我正在嘗試將uint8_t[4] (或僅4個uint8_t)轉換為單個無符號長(特別是GUID的Data1部分)( https://msdn.microsoft.com/zh-cn/14288352-43c3-4e4d -a3f1-e924a8261d2b )從結構Rpc.h

我公認的幼稚方法是:

UUID newUUID;
newUUID.Data1 = 0x0a << 24;
newUUID.Data1 = 0x04 << 16;
...

但是,正如我本可以告訴自己的那樣,最后一行覆蓋了中間一行,導致newUUID.Data1為00040000而不是0a040000

如何設置第9-16位最高有效位,同時保留1-8位最高有效位?

您可以使用|=運算符來設置這些新的,不重疊的位范圍:

UUID newUUID;
newUUID.Data1 = 0x0a << 24;
newUUID.Data1 |= 0x04 << 16;

這是工作中非常常見的事情,我為此定義了一些宏:

#include <stdint.h>

#define B4TODW_LE(c0, c1, c2, c3) (uint32_t) ((uint32_t) (uint8_t) (c0) | ((uint32_t) (uint8_t) (c1) << 8) | ((uint32_t) (uint8_t) (c2) << 16) | ((uint32_t) (uint8_t) (c3) << 24))
#define B4TODW_BE(c0, c1, c2, c3) (uint32_t) ((uint32_t) (uint8_t) (c3) | ((uint32_t) (uint8_t) (c2) << 8) | ((uint32_t) (uint8_t) (c1) << 16) | ((uint32_t) (uint8_t) (c0) << 24))

您可以這樣做:

newUUID.Data1 = B4TODW_BE(0x0a, 0x04, ...);

暫無
暫無

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

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