设置VS调试器的字节顺序

时间:2014-01-22 13:26:01

标签: c++ visual-studio debugging unicode

我正在使用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完成所有处理。

4 个答案:

答案 0 :(得分:3)

这不仅仅是调试器。 Visual Studio的wchar_t函数是主机所用的小端。当您想要处理数据时,无论如何都需要将字符串endianess反转为little endian。

即使您将字符串输出到具有不同endianess的文件,也可以进行此更改。字符串被定义为字节序列,无论如何,应用于字符串的endianess看起来很奇怪。

答案 1 :(得分:1)

最好的方法是定义自己的类型并为其创建调试器类型可视化工具(请参阅Customizing the Visual Studio Debugger Display of Your Datahere)。

或许你可以通过在观察窗口中将地址移动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"。