如何stdin任何字节(0-255)?

时间:2014-09-30 21:03:23

标签: stdin

我有一个非常简单的跟随代码,从stdin获取4个字节,并以十六进制格式逐字节打印出来。

// 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样式字符串中的"\x11\x11\x11\x11"或C中的0x11111111等常量格式。

有什么方法可以将任何字节0-255提供给stdin,以便我可以完全控制缓冲区的值是什么?

编辑:我在一个我没有权限创建文件的系统上。

可悲的是,我已经坚持了一个星期了。非常感谢!。

2 个答案:

答案 0 :(得分: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之外,我不确定你是如何管理它的。

答案 1 :(得分:0)

基于this SO,您可以为ASCII代码0-255键入以下内容:

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

将11更改为您需要的任何ASCII代码。