簡體   English   中英

當C ++被當作數組對待時,如何看待指向無符號字符的指針?

[英]How does C++ look at a pointer to an unsigned char when it's treated like an array?

我正在嘗試解密一些代碼,並且似乎在按順序向后處理順序內存地址中的值。 一個64位有符號整數被強制轉換為8位無符號char。這是它的簡化版本:

unsigned char* ucMyChar;
unsigned __int64 ui64MyInt;
CString strMyString;

//some code that assigns a value to ui64MyInt

ucMyChar = (unsigned char*)&ui64MyInt;

strMyString.Format("%02x%02x%02x%02x-%02x%02x-1%01x%02x",
                    ucMyChar[3], ucMyChar[2], ucMyChar[1], ucMyChar[0],
                    ucMyChar[5], ucMyChar[4], ucMyChar[7], ucMyChar[6]);

如果ui64MyInt的值為:

0x010203040a0b0c0d

以下哪項是格式正確的字符串?

04030201-0b0a-1d0c

要么

0a0b0c0d-0304-1102

我問的原因是因為我有一個值,並且試圖向后運行此代碼中的數學運算,因為一些必需的信息包含在用於生成此字符串的原始值中,並且沒有其他方法可以由於文件損壞而恢復所述信息。 到目前為止,我使用第一個字符串想出的值似乎超出了預期范圍,而且我不確定是否正在發生數學錯誤或是否不了解無符號字符指針的工作方式。

它是實現定義的,整數的位以什么順序存儲在內存中。 (這意味着編譯器可以決定,並且幾乎可以肯定,它是基於CPU決定CPU如何在內存中存儲整數的決定)。

兩種最常見的布局是(最低地址在前)

  • 01 02 03 04 0a 0b 0c 0d(典型示例:ARM)
  • 0d 0c 0b 0a 04 03 02 01(典型示例:x86 / x64)

其他布局也是可能的。 例如,如果用於32位CPU的編譯器通過彼此相鄰放置兩個32位int滾動了自己對__int64的支持,則它甚至可能會走:

  • 04 03 02 01 0d 0c 0b 0a

C和C ++語言是經過精心設計的,因此這一細節並不重要。 您可以編寫代碼,以便無論使用哪種表示形式,代碼都可以相同。

當某人編寫如下代碼時:

ucMyChar = (unsigned char*)&ui64MyInt;

他們有意識地繞過了C ++的功能以獨立於整數表示而運行。 (強制轉換是對類型系統進行某種旁路的好兆頭!)

暫無
暫無

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

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