2014-09-30 43 views
0

我有一個非常簡單的下面的代碼,從stdin得到4個字節,並以十六進制格式逐字節地打印出來。如何標準化任何字節(0-255)?

// Code may be different but the point is to input any byte value 0 to 255 from stdin 
int main(int argc, char** argv) { 
    char buffer[4]; 
    read(0, buffer, 4); // or gets(buffer) 
    int i; 
    for(i = 0; i < 4; i++) { 
     printf("%x", buffer[i]); 
    } 
} 

我遇到的問題是,我感到我可以通過鍵入鍵盤,所以我可以在任何一個字節不能提供給stdin限制。例如,如果我正在處理ACSII,則不可能給0x11,因爲ASCII 0x11Device Control 1 (oft. XON)哪個鍵盤沒有。如果我正在處理UTF-8,我會遇到更多問題,因爲字符不使用全部字節(它會上升到0x7f並開始使用2個字節)。

我在找C.在C風格的字符串或常量格式類似"\x11\x11\x11\x11"0x11111111

有哪些途徑可給予任何字節0-255到標準輸入,讓我有充分的控制在什麼樣的價值去緩衝區?

編輯:我在一個系統,我沒有權限創建一個文件。

不幸的是,我一直堅持這一個禮拜。非常感謝你!。

+1

根據您的操作系統,您可以將文件重定向到STDIN,並將字節序列放在那裏。 – bstamour 2014-09-30 21:05:19

+0

將它寫入文件並將進程的輸入重定向到所述文件?例如'./a.out Medinoc 2014-09-30 21:05:23

+0

@bstamour。不幸的是,我在一個我沒有權限制作文件的系統上。我試過類似./a.out <「HI」的樣子,希望它能將字符串「HI」讀作字符串,但不起作用。 – 2014-09-30 21:09:16

回答

0

基於this SO你可以鍵入ASCII碼0-255如下:

printf "\x$(printf %x 11)" | yourprogram 

更改11到你需要的任何ASCII碼。

1

首先,它是值得了解你的鍵盤可以發送32和126

之間的所有代碼以取得0和31之間的代碼,以及代碼127,您可以用下面的方法的任何典型的終端,例如上如Linux上的gnome-terminal或Windows上的PuTTY:

首先,按下Ctrl + V。這告訴終端將你輸入的下一個事物作爲文字字符發送。您現在可以鍵入以下任一項:

  • 對於介於1和26之間的值,請按Ctrl + A到Ctrl + Z。
  • 對於27到31之間的值,請按Ctrl + 3到Ctrl + 7。您必須使用字母上方的數字 - 請勿使用數字鍵盤。
  • 對於值127,請按Ctrl + 8。
  • 對於值0,請按Ctrl + @。 (在美國鍵盤,這意味着按Ctrl + Shift + 2,英國鍵盤是按Ctrl + Shift +撇號上。)

這可以讓你在普通的打字中輸入任何字符(下面128)(而計劃就像gabber所建議的printf一樣,可以工作,但如果你想在你的特殊字符之前和之後正常地輸入,你就不能使用它們)。

要獲得128以上的字符,如果您使用的是PuTTY,則可以將編碼設置爲CP437(或類似),並複製Wikipedia表中的字符。在PuTTY之外,我不確定你會如何管理它。