【问题标题】:how to stdin any byte (0-255)?如何标准输入任何字节(0-255)?
【发布时间】:2014-09-30 21:03:22
【问题描述】:

我有一个非常简单的以下代码,它从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 0x11 是键盘没有的 Device Control 1 (oft. XON)。如果我处理 UTF-8,我会遇到更多问题,因为字符不使用完整的字节范围(它上升到 0x7f 并开始使用 2 个字节)。

我正在寻找 C 风格字符串中的 "\x11\x11\x11\x11" 或 C 中的 0x11111111 等常量格式。

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

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

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

【问题讨论】:

  • 根据您的操作系统,您可以将文件重定向到 STDIN,并将您的字节序列放在那里。
  • 将其写入文件并将进程的输入重定向到所述文件?例如./a.out &lt;file.txt
  • @bstamour。不幸的是,我在一个没有权限制作文件的系统上。我尝试了类似 ./a.out

标签: stdin


【解决方案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 之外,我不确定您将如何管理它。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2014-07-08
      • 2021-12-13
      • 2015-10-08
      • 2017-02-06
      相关资源
      最近更新 更多