2012-03-04 63 views

回答

3

是的,這是可能的。雖然通常情況下,文本是有意爲文本的,但有許多程序設計用於從標準I/O通道獲取二進制輸入或寫入二進制輸出。

您唯一需要注意的是通常在Windows下以文本模式打開stdout/stdin,所以您應該將它們切換到二進制模式以避免字符轉換。

要在Windows上stdin/stdout設置二進制模式下,你需要使用_setmode電話:

#include <stdio.h> 
#include <fcntl.h> 
#include <io.h> 

int main(void) 
{ 
    int result; 

    // Set "stdin" to have binary mode: 
    result = _setmode(_fileno(stdin), _O_BINARY); 
    if(result == -1) 
     perror("Cannot set mode"); 
    else 
     printf("'stdin' successfully changed to binary mode\n"); 
} 

還要注意注意文件緩衝。通常,程序只會在輸出到交互式控制檯時刷新緩衝區,而不是其他進程。因此,如果您需要同步,請在寫入消息後記得撥打fflush,否則其他進程將無法獲取數據。

+0

爲什麼有些人在這裏談論Base64編碼? Dervall是否正確如果數據不顯示,我不需要它? (數據其實不是) – P5music 2012-03-04 11:13:48

+0

@ P5music:問問他們。就像我說的,有很多程序可以輸入或輸出二進制數據(例如,您可以使用'ffmpeg'來解碼電影並將輸出寫入原始YUV幀,以便其他程序可以處理該視頻,或者如果您想對磁盤單元執行原始數據壓縮備份,則可以在Linux中使用'dd - if =/dev/whatever | gz> backup.dd.gz',它完美的工作)。在Windows上,這是文本/二進制模式的煩人的事情,但它可以解決。當然在終端拋出二進制數據將是可怕的,但如果輸出到另一個進程,那麼一切正常... – 6502 2012-03-04 11:24:43

+0

請你能告訴我printf指令發送數據(我知道字節數和指針)從C應用程序的控制檯? – P5music 2012-03-05 18:15:49

1

您可以Base 64-Encode/Decode的數據。這將避免需要在標準輸入/輸出流上發送純粹的「比特」。

-1

如果您選擇適當的編碼,您可以這樣做,因爲控制檯是文本流。使用例如Base64編碼爲您的二進制數據,它會正常工作。另一種選擇是「Quoted-printable」格式。當然最終的字節數比原始二進制數據多,但恕我直言,唯一的方法就是使用控制檯安全地執行它。

0

如果進程將在另一個進程中進行託管,該進程將從寫入二進制數據的進程捕獲標準輸出,則無需對其進行編碼。在這種情況下,您可以將原始二進制數據寫入輸出並完成它。這是例如graphviz中寫入dot工具的圖像如何工作的,默認情況下,它不對其輸入進行編碼。通過在命令shell中使用>,這些類型的工具也很容易通過管道傳輸到文件。

只有當數據輸出將在控制檯上顯示時,您才需要對其進行編碼。打印圖像文件的內容並不是一個好主意。

+0

我可以通過您描述的這種方法解決安全問題嗎? – P5music 2012-03-04 11:08:20

+0

我不是世界上最好的安全人員,但是在我看來,寫入到stdout幾乎是一樣的,無論你實際寫什麼。只要你不打印到實際的控制檯。如果你這樣做的話不會發生太多事情,它只會打印一些時髦的角色,而且由於鈴聲特點,揚聲器有時會發出很多嘟嘟聲。如果stdout永遠達不到實際的打印控制檯,amd會被另一個進程捕獲,那麼它就像一個二進制流一樣具有與打開文件流相同的安全特性。 – Dervall 2012-03-04 11:14:02

相關問題