我正在使用VS 2012并使用C ++编程。我有一个宽字符串
wchar_t *str = L"Hello world".
从技术上讲,我从文件中读取字符串,但我不知道这是否有所作为。当我在内存窗口中查看str
时,它看起来像这样:
00 48 00 65 00 6c 00 6c 00 6f 00 2c 00 20 00 77 00 6f 00 72 00 6c 00 64 00 21 00
正如您所看到的,字符串作为big-endian存储在内存中。
当我将鼠标悬停在字符串上时,我得到了:
L"䠀攀氀氀漀Ⰰ 眀漀爀氀搀℀"
在我反转str
的字节序后,内存看起来像是:
48 00 65 00 6c 00 6c 00 6f 00 2c 00 20 00 77 00 6f 00 72 00 6c 00 64 00 21 00 00
悬停在上面看起来像:
L"Hello, world!"
默认情况下,调试器似乎以little-endian显示UTF-16。我的程序读取big-endian文件,因此保持反转所有字符串的字节序以调试它们是非常繁琐的。有没有办法改变调试器显示的字节顺序?
除了调试目的,我可以用big endian完成所有处理。
答案 0 :(得分:3)
这不仅仅是调试器。 Visual Studio的wchar_t函数是主机所用的小端。当您想要处理数据时,无论如何都需要将字符串endianess反转为little endian。
即使您将字符串输出到具有不同endianess的文件,也可以进行此更改。字符串被定义为字节序列,无论如何,应用于字符串的endianess看起来很奇怪。
答案 1 :(得分:1)
最好的方法是定义自己的类型并为其创建调试器类型可视化工具(请参阅Customizing the Visual Studio Debugger Display of Your Data或here)。
或许你可以通过在观察窗口中将地址移动1个字节来快速破解它。
您使用的是非本机字符串格式,恰好与本机格式“感觉”相似。所以你很想认为应该有几乎的方法来做到这一点。但是对于调试器来说,它只是一个外来的二进制格式。调试器不是为处理外部字节序而设计的,因为它不处理可视化OGG流数据包。
如果要使用可用工具来操作native-endian Unicode字符串,则需要转换为native-endian Unicode格式。
答案 2 :(得分:1)
正如已经指出的那样,VS使用本机字节序,即
英特尔/ AMD上的小端。问题是你不是
正确读取字符串;你应该灌输
std::istream
具有读取UTF-16BE的区域设置(因为这是
显然你正试图阅读的编码形式)。
std::istream
(或者更确切地说是支持std::filebuf
)会
阅读时自动进行代码翻译
和写作。
答案 3 :(得分:0)
您可以使用上下文菜单设置Memory窗口的字节顺序。在Memory窗口中单击鼠标右键,然后选中" Big Endian"。