我正在使用具有printf()
函数的跨平台库将数据字节转储到控制台。我注意到由于某种原因,字节被翻译成它们的解码变体,而不是"按原样"转储它们。但是当我使用NSLog
函数时,输出是正确的。
这是我的单元测试中的简化代码示例:
unsigned char *buff = new unsigned char[3]{ 0xff, 0xfe, 0x00};
NSLog(@"nn---%s---nn", buff);
printf("nn---%s---nn", buff);
它产生以下输出:
2017-08-03 12:08:53.879 xctest[4725:44271]
---ˇ˛---
---377376---
如您所见,NSLog0xff, 0xfe
"正确"处理字节,只写入两个符号ˇ˛
但 printf377376
写。
在这种情况下,如何使 printf 打印ˇ˛
(或任何其他两个符号(?
我不在乎 Unicode 的正确性;在这种情况下,我只需要 printf 只打印两个符号而不是那个xy
字符串。
顺便说一句,当我在 Windows 上运行相同的printf
代码时,它只输出两个字符而不是xy
,所以这个问题可能是 *nix 特定的。
NSLog
输出是不是"按原样"转储到"控制台"(在本例中为 stderr(的输出 - 它正在为两个字节313 207 313 233
写入四个字节377 376
。
printf
将377 376
的字节输出到"控制台"(在本例中为 stdout(。
如果将代码编译为命令行应用,然后在终端管道中通过od -bc
输出,您将看到此信息。
因此,Xcode的漂亮打印正在产生377376
。
如果你想要"按原样"的字节,你可以使用fprintf
写入文件,或者如果你不能更改代码,你可以使用dup(2)
等来捕获发送到stdout的输出。
或者,您可以预先处理字符串以用单个字符替换不可打印的内容。
呵呵