2014-09-30 42 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之外,我不确定你会如何管理它。