当无符号字符被视为数组时,C++如何查看指针?

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

本文关键字:C++ 何查看 指针 数组 字符 无符号      更新时间:2023-10-16

我试图破译一些代码,它似乎是处理顺序内存地址的值从我预期的向后。一个64位有符号整数被转换为一个8位无符号字符,下面是它的简化版本:

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

我问的原因是因为我有一个值,我试图在这段代码中反向运行数学,因为一些所需的信息包含在用于生成此字符串的原始值中,并且由于文件损坏,没有其他方法可以恢复所述信息。到目前为止,我使用第一个字符串提出的值似乎超出了预期范围,我不确定我是否犯了数学错误,或者如果我不理解unsigned char指针的工作方式。

这是实现定义的,整数的位在内存中的存储顺序。(这意味着编译器可以决定,并且几乎可以肯定,它基于CPU对CPU如何在内存中存储整数的决定)。

两种最常见的布局是(最低地址优先)

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

其他布局也是可能的。例如,如果32位CPU的编译器通过将两个32位整数相邻放置来滚动自己对__int64的支持,它甚至可能会这样:

C和c++语言是精心设计的,所以这个细节并不重要;您可以编写代码,使其无论使用哪种表示方式都能正常工作。

当有人写这样的代码:

ucMyChar = (unsigned char*)&ui64MyInt;

,它们有意识地绕过c++的功能,独立于整数表示。(强制类型转换是一个很好的信号,表明正在进行一些类型系统的绕过!)

相关文章: