gpt4 book ai didi

c++ - 当 unsigned char 被视为数组时,C++ 如何看待指向它的指针?

转载 作者:行者123 更新时间:2023-11-30 04:02:48 27 4
gpt4 key购买 nike

我正在尝试破译一些代码,它似乎在处理顺序内存地址中的值,这与我的预期相反。一个 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 的支持,它甚至可能会:

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

C 和 C++ 语言经过精心设计,所以这个细节并不重要;您可以编写您的代码,以便无论使用哪种表示形式,它都能以相同的方式工作。

当有人编写如下代码时:

ucMyChar = (unsigned char*)&ui64MyInt;

他们有意识地绕过 C++ 的功能以独立于整数表示进行操作。 (转换是一个很好的迹象,表明正在绕过类型系统!)

关于c++ - 当 unsigned char 被视为数组时,C++ 如何看待指向它的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24875719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com