如何使 printf 以与 NSLog 相同的方式打印字符缓冲区?



我正在使用具有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

printf377 376的字节输出到"控制台"(在本例中为 stdout(。

如果将代码编译为命令行应用,然后在终端管道中通过od -bc输出,您将看到此信息。

因此,Xcode的漂亮打印正在产生377376

如果你想要"按原样"的字节,你可以使用fprintf写入文件,或者如果你不能更改代码,你可以使用dup(2)等来捕获发送到stdout的输出。

或者,您可以预先处理字符串以用单个字符替换不可打印的内容。

呵呵

最新更新