簡體   English   中英

表示char *到unsigned int

[英]what does it mean?casting char* to unsigned int

我在下面閱讀了一些代碼:

typedef unsigned int uint32_t;    
typedef unsigned short uint16_t;

inline uint16_t NS(uint16_t i16)
{
    return((i16 << 8) | (i16 >> 8));
}

inline uint32_t NL(uint32_t i32)
{
    return((uint32_t(NS(i32)) << 16) | NS(i32>>16));
}

char* data = (char*) malloc(10);

strcpy(data, "123456789");
const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);
i32 = NL(i32);
m_data += 4u;

我不明白uint32_t i32 = *((uint32_t*)m_data); ,這是什么意思?

而且不了解i32 = NL(i32); m_data += 4u; i32 = NL(i32); m_data += 4u; 以及功能NS和NL。

有人可以告訴我嗎?

代碼有錯誤(會泄漏內存):

char* data = (char*) malloc(10);
data="123456789\0";

應該:

char* data = (char*) malloc(10);
strcpy(data, "123456789");

這也意味着您無法告訴任何有關data指針對齊的data ,而來自malloc()的賦值可以保證數據對於任何基本類型都具有足夠的對齊方式。 但是,這與接下來的兩行問題是切線的:

const char *m_data = (const char *)data;
uint32_t i32 = *((uint32_t*)m_data);

在這些行的第一行中進行強制轉換是不必要的,但沒有害處。 下一行將存儲在m_data中的指針視為uint32_t指針,對其進行取消引用,然后將結果分配給i32 如果值m_data是從哪里來的data ,其來自malloc()數據將是足夠充分順應了這個不是一個問題。 對於字符串分配,不能保證m_data中的指針對齊得足夠好以用作uint32_t指針。 因此,所有地獄可能會破裂,或者您可能會好起來。 由於內存泄漏,行為未定義。

NS()函數按字節交換16位整數。 NL()函數在32位整數中交換16位值。 這意味着您以“開始”圖中顯示的值開始,然后以“完成”圖中顯示的值結束。

+------+------+------+------+
|  MSB | NMSB | NLSB |  LSB |   Start
+------+------+------+------+

+------+------+------+------+
|  LSB | NLSB | NMSB |  MSB |   Finish
+------+------+------+------+

m_data += 4u; 將4加到指針m_data ,所以不是在指向1的字符串,它在點5

uint32_t i32 = *((uint32_t*)m_data);

從字面上看,這意味着將指針m_data解釋為指向uint32_t的指針並對其取消引用。 目的是將data指定的字符解釋為uint32_t

函數NS和NL似乎正在取其參數左右兩半的按位“或”並將其返回。

m_data += 4u;

這應該等效於不帶后綴的相同語句。 它只是將指針m_data遞增到指向該地址之前指向的字符上方四個字符的字符。

因此,當給NS一個16位值i16 (每個字符為一位)時:

aaaaaaaabbbbbbbb

那么表達式i16 << 8 (左移8位,右移零)將為您提供bbbbbbbb00000000i16 >> 8將為00000000aaaaaaaa 將這些或運算在一起可得出:

   bbbbbbbb00000000
OR 00000000aaaaaaaa
   ----------------
   bbbbbbbbaaaaaaaa

換句話說,它交換了兩個字節。

N32函數的同N32在32位值中交換16位一半,但由於它還在每個一半上調用N16 ,因此執行以下轉換:

aaaaaaaabbbbbbbbccccccccdddddddd
               ||
               VV
ddddddddccccccccbbbbbbbbaaaaaaaa

當您的特定體系結構上的順序不同時,通常在轉換為網絡字節順序或從網絡字節順序轉換時使用。


語句系列:

const char *m_data = somethingOrOther;
uint32_t i32 = *((uint32_t*)m_data);

工作原理如下。 首先,它將字符指針轉換為32位值的指針。 然后,它取消引用該指針以提取32位值。

這意味着將字符串"1234"的前四個字符(假設char數據類型為8位)視為32位整數值,並傳遞給N32以進行上述字節交換操作。

最后, m_data += 4u只是將無符號值4添加到字符指針,以便其前進到下一個 32位值(在"5678" )。

暫無
暫無

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

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