簡體   English   中英

如何使printf像NSLog一樣打印字符緩沖區?

[英]How to make printf to print a character buffer the same way as NSLog does?

我正在使用帶有printf()函數的跨平台庫將數據字節轉儲到控制台。 我注意到,由於某些原因,字節被轉換為它們的已解碼變體,而不是按原樣轉儲它們。 但是當我使用NSLog函數時,輸出是正確的。

這是我的單元測試中的簡化代碼示例:

unsigned char *buff = new unsigned char[3]{ 0xff, 0xfe, 0x00};

NSLog(@"\n\n---%s---\n\n", buff);
printf("\n\n---%s---\n\n", buff);

它產生以下輸出:

2017-08-03 12:08:53.879 xctest[4725:44271]

---ˇ˛---


---\377\376---

如您所見,NSLog“正確”處理了字節0xff, 0xfe並且只寫了兩個符號ˇ˛而printf卻寫了\\377\\376

在這種情況下,如何使printf打印ˇ˛ (或其他兩個符號)?

我不在乎Unicode的正確性。 在這種情況下,我只需要printf只打印兩個符號,而不是那個\\x\\y字符串。

順便說一句,當我在Windows上運行相同的printf代碼時,它僅輸出兩個字符而不是\\x\\y ,因此此問題可能是* nix特定的。

NSLog輸出是不會“按原樣”轉儲到“控制台”(在這種情況下為stderr)的輸出-它正在為兩個字節377 376寫入四個字節313 207 313 233

printf正在將字節377 376輸出到“控制台”(在這種情況下為stdout)。

如果將代碼編譯為命令行應用程序,然后在終端管道中通過od -bc輸出,您將看到此信息。

因此,正是Xcode的漂亮印刷產生了\\377\\376

如果要“按原樣”字節,則可以使用fprintf寫入文件,或者如果不能更改代碼,則可以使用dup(2)等捕獲發送到stdout的輸出。

或者,您可以預處理字符串以用單個字符替換不可打印的字符串。

HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM