linux 在命令行上将字符串转换为十六进制

lx0bsm1f  于 12个月前  发布在  Linux
关注(0)|答案(5)|浏览(149)

我正在尝试使用命令行尽可能有效地将“Hello”转换为十六进制的48 65 6c 6c 6f
我试着在printf和谷歌上搜索,但我找不到任何地方。
任何帮助非常感谢。
在此先表示感谢,

t30tvxxf

t30tvxxf1#

echo -n "Hello" | od -A n -t x1

字符串
说明:

  • echo程序将为下一个命令提供该字符串。
  • -n标志告诉echo不要在“Hello”的末尾生成新行。
  • od程序是“八进制转储”程序(我们将提供一个标志,告诉它以十六进制而不是八进制转储)。
  • -A n标志是--address-radix=n的缩写,n是“none”的缩写。如果没有这一部分,命令将在左侧输出一个丑陋的数字地址前缀。这对大型转储很有用,但对短字符串来说没有必要。
  • -t x1旗标是--format=x1的缩写,其中x是“十六进制”的缩写,1表示1个字节。
    更多详细信息,请ExplainShell.com:https://explainshell.com/explain?cmd=echo+-n+%22Hello%22+%7C+od+-A+n+-t+x1
2guxujil

2guxujil2#

如果你想这样做,并删除你需要的空间:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'

字符串
流水线中的前两个命令已经很好地解释了in this other answer。最后一个命令与其中一个注解的不同之处在于它既正确又经过测试。解释是:

  • sed是一个艾德流。
  • ss替换命令。
  • /打开一个正则表达式-任何字符都可以使用。/是常规的,但不便于处理XML或路径名。
  • /或您选择的替换字符,关闭正则表达式并打开替换字符串。
  • / */中,*匹配前一个字符(在本例中为空格)的任何序列。
  • /或您选择的替代字符,关闭替换字符串。在这种情况下,替换字符串//为空,即匹配被删除。
  • g是一个选项,可以在每一行上全局地进行g替换,而不是每一行只替换一次。
  • 引号使命令解析器不会混淆-整个序列作为第一个选项传递给sed,即sed脚本。

sed 's/^ *//'只从每一行的开头剥离空格(^匹配行的开头-sed中的“模式空格”-speak)。
如果您还想删除换行符,最简单的方法是追加

| tr -d '\n'


到命令管道。它的功能如下:

  • |将之前处理过的流提供给此命令的标准输入。
  • trtranslate命令。
  • -d指定删除匹配字符。
  • 引号列出匹配字符-在本例中只是换行符(\n)。翻译只匹配单个字符,而不是序列。

sed在处理换行符时很特殊。这是因为sed是最古老的unix命令之一。普遍存在的遗留软件使其无法修复。我知道这一点,因为我出生在unix出生之前。
这个问题的历史起源是认为换行符是一个行分隔符,而不是行的一部分。因此,它被行处理实用程序剥离,并由输出实用程序重新插入。麻烦的是,这使得对用户数据的结构做出了假设,并在许多设置中强加了不自然的限制。sed无法轻松地删除换行符是这种格式错误的最常见的例子之一。意识形态造成的悲伤。
使用sed可以删除换行符-只是我知道的所有解决方案都让sed一次处理整个文件,这对非常大的文件来说是阻塞的,违背了流编辑器的目的。任何保留行处理的解决方案,如果可能的话,都将是一个不可读的多管道老鼠窝。
如果您坚持使用sed,请尝试:

sed -z 's/\n//g'


-z告诉sed使用空值作为行分隔符。
在内部,C中的字符串以null结束。-z选项也是遗留的结果,为C程序员提供方便,他们可能喜欢使用一个临时文件,里面填充了C-字符串,并且没有换行符。这样他们就可以轻松地一次读取和处理一个字符串。同样,关于用例的早期假设对用户数据强加了人为的限制。
如果省略g选项,这个命令只删除第一个换行符。使用-z选项,sed将整个文件解释为一行(除非文件中嵌入了零星的null),以null结尾,因此这也会在大文件中阻塞。
你可能会认为

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'


可能会起作用。第一个命令在每行的前面逐行放置一个null,导致\n\x00结束每行。第二个命令从每行中删除一个换行符,现在由null分隔-由于第一个命令,只有一个换行符。剩下的都是虚假的null。到目前为止,太好了。这里的坏主意是管道将逐行地提供最后一个命令,因为这就是流的构建方式。实际上,最后一个命令,正如所写的那样,只会删除一个null,因为现在整个文件没有换行符,因此只有一行。
简单的管道实现使用一个中间临时文件,所有输入都被处理并馈送到该文件。下一个命令可能正在另一个线程中运行,同时阅读该文件,但它只看到整个流(尽管不完整)并且不知道馈送文件的块边界。即使管道是内存缓冲区,下一个命令将流视为一个整体。2缺陷不可避免地被烘焙到sed中。
要使这种方法工作,您需要在最后一个命令上使用g选项,因此,它在大文件上也会阻塞。
底线是:不要使用sed来处理换行符。

5anewei6

5anewei64#

进一步处理这个问题,一个可行的解决方案是删除“*",如果需要替换实际字符,则原始要求也不需要简单地删除空格,如下所示

echo -n "Hello" | od -A n -t x1 | sed 's/ /%/g'

%48%65%6c%6c%6f

字符串
因此,我认为这是对原始Q的改进,因为该语句现在确实需要,而不仅仅是表面上。

4zcjmb1e

4zcjmb1e5#

结合TMS和i-always-rtfm-and-stfw的答案,以下代码在Windows下使用gnu-utils版本的程序'od'、'sed'和'tr'运行:

echo "Hello"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"

字符串
或在CMD文件中为:

@echo "%1"| tr -d '\42' | tr -d '\n' | tr -d '\r' | od -v -A n -tx1 | sed "s/ //g"


我的解决方案的一个限制是它将删除所有双引号(“)。

"tr -d '\42'" removes quote marks that the Windows 'echo' will include.
"tr -d '\r'" removes the carriage return, which Windows includes as well as '\n'.
The pipe (|) character must follow immediately after the string or the Windows echo will add that space after the string.
There is no '-n' switch to the Windows echo command.

相关问题