【问题标题】:Can you pass non-ascii characters to argv?你可以将非ASCII字符传递给argv吗?
【发布时间】:2018-05-06 17:21:48
【问题描述】:

假设您有一个接受命令行参数的二进制可执行文件。

./process in

在这种情况下,输入是:'i' = 0x69,'n' = 0x6E

有没有我可以传递 特定字节 作为输入,而不是 ASCII?

也就是我要传0xF9。

0xF9 = 11111001

请注意,我无法在屏幕上输入任何 ASCII 字符(据我所知)以二进制计算为 1111 1001(因为 ASCII 被限制在 0-127 的范围内)。

但是,我希望这个可执行文件接收字节 0xF9 作为输入。

可执行文件是固定的;我没有它的源代码,也无法修改。

【问题讨论】:

  • 不清楚您要做什么,因为程序参数是以 nul 结尾的字符串。
  • 字符串是一个字符数组。一个字符就是一个字节。我希望有一个字符,那个字节是“1111 1001”。 (当然,后面是一个空值)。
  • argv 是一个指向字节数组的指针数组,而不是 ASCII 字符。你可以随心所欲地解释这些字节。
  • 我不知道这是否有帮助,但在 Windows 控制台中,您可以通过按住 Alt 键并在此 在键盘上输入其十进制值来输入字符值案例249.
  • 如果你使用 Bash 作为你的 shell,那么 $’\xF9’ 应该将字符(字节)传递给你的程序。唯一不能出现在参数中的字符(字节)是空字节。这严格地标志着争论的结束。

标签: c assembly x86 intel


【解决方案1】:

在 MS-DOS 时代,您可以使用组合键 ALT-249 输入 0xF9 = 11111001 = 249 在键盘上键入。

对于 Windows,这仍然像 this article 中解释的那样工作。

对于 Linux/Unix,您可以使用类似的方法,使用 this answer 中说明的组合键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2020-09-23
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    相关资源
    最近更新 更多