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

Eam*_*orr 22 linux string printf command-line hex

我正在尝试48 65 6c 6c 6f使用命令行尽可能高效地将"Hello"转换为十六进制.

我试过看printf谷歌,但我无法到达任何地方.

任何帮助非常感谢.

提前谢谢了,

TMS*_*TMS 48

echo -n "Hello" | od -A n -t x1
Run Code Online (Sandbox Code Playgroud)

说明:

  • echo计划将提供该字符串的下一个命令.
  • -n标志告诉echo在"Hello"结尾处不生成新行.
  • od计划是"八进制转储"计划.(我们将提供一个标志,告诉它以十六进制而不是八进制转储它.)
  • -A n标志是简称--address-radix=n,n为"none"的缩写.如果没有此部分,该命令将在左侧输出一个丑陋的数字地址前缀.这对于大型转储很有用,但对于短的字符串则没有必要.
  • -t x1标志是短的--format=x1,x表示"十六进制",1表示1字节.

  • 嘿,这真的很好用。您是否知道消除空格的方法??? (3认同)
  • 上述解决方案和注释中的解决方案没有考虑当达到一定数量的字符时其中一个工具产生的换行符。 (3认同)
  • echo -n"你好"| od -A n -t x1 | sed's/^*//' (2认同)
  • 我相信你的意思是回声-n"你好"| od -A n -t x1 | sed's/*// g' (2认同)

m.k*_*ski 10

echo hello | hexdump -v -e '/1 "%02X "'

  • `回声你好| hexdump -v -e '/1 "%02X"'` 如果不需要空间 (2认同)

小智 6

显然,@ TMS无法RTFM。(请参阅他对先前答案的评论)

如果要这样做并删除所需的空格,请执行以下操作:

echo -n "Hello" | od -A n -t x1 | sed 's/ *//g'
Run Code Online (Sandbox Code Playgroud)

@TMS在他的答案中很好地解释了管道中的前两个命令,由@James编辑。最后一条命令与@TMS注释的不同之处在于它既正确又已经过测试。解释是:

  • sed是一个小号 tream itor。
  • s小号 ubstitute命令。
  • / 打开一个正则表达式-可以使用任何字符。 /是常规的,但是不方便处理XML或路径名。
  • / 或您选择的替代字符,关闭正则表达式并打开替换字符串。
  • / */*匹配前一字符的任何序列(在此情况下,空间)。
  • / 或您选择的替代字符,将关闭替换字符串。在这种情况下,替换字符串//为空,即匹配项被删除。
  • g 是做这个替代选项每行,而不是为每一行lobally只有一次。
  • 引号使命令解析器不致混淆-整个序列sed作为第一个选项传递给sed脚本,即脚本。

@TMS大脑子(sed 's/^ *//')仅从每行的开头去除空格(^与该行的开头-用sed-speak表示“模式空间”相匹配)。

如果您还想删除换行符,最简单的方法是添加

| tr -d '\n'
Run Code Online (Sandbox Code Playgroud)

到命令管道。其功能如下:

  • | 将先前处理的流馈送到此命令的标准输入。
  • trtr anslate命令。
  • -d 指定删除匹配字符。
  • 引号会列出您的匹配字符-在这种情况下,只需换行(\n)。翻译仅匹配单个字符,不匹配序列。

sed当处理换行符时,它是唯一受阻的。这是因为它是sed最古老的unix命令之一-它是在人们真正知道自己在做什么之前创建的。普遍使用的旧版软件使其无法修复。我知道这是因为我出生之前unix就出生了。

问题的历史渊源是这样的想法:换行符是行分隔符,而不是行的一部分。因此,它被行处理实用程序剥离,并被输出实用程序重新插入。问题在于,这会假设用户数据的结构,并在许多设置中施加不自然的限制。 sed无法轻松删除换行符是这种格式错误的意识形态引起悲痛的最常见例子之一。

可以使用以下命令删除换行符sed-只是我所知道的所有解决方案都可以立即sed处理整个文件,这对于非常大的文件会造成阻塞,从而违反了流编辑器的目的。如果可能的话,任何保留行处理的解决方案都是不可读的多个管道嵌套。

如果您坚持使用sedtry:

sed -z 's/\n//g'
Run Code Online (Sandbox Code Playgroud)

-z告诉sed您将null用作行分隔符。

在内部,输入字符串以Cnull结尾。该-z选项也是遗留结果的结果,为C希望使用C-strings且不包含换行符的临时文件的程序员提供了便利。然后,他们可以轻松地一次读取和处理一个字符串。再次,关于用例的早期假设对用户数据施加了人为的限制。

如果省略该g选项,则此命令仅删除第一行。使用该-z选项可以sed将整个文件解释为一行(除非文件中嵌入零散的空值),并以空值终止,因此这也会在大型文件上造成阻塞。

你可能认为

sed 's/^/\x00/' | sed -z 's/\n//' | sed 's/\x00//'
Run Code Online (Sandbox Code Playgroud)

可能有用。第一个命令逐行在每行的开头放置一个空值,从而导致\n\x00每行结束。第二个命令从每行中删除一个换行符,现在用空值分隔-通过第一个命令将只有一个换行符。剩下的就是虚假的空值。到目前为止,一切都很好。这里的坏主意是,管道将逐行输入最后一个命令,因为这是流的构建方式。实际上,最后写入的命令仅会删除一个null,因为现在整个文件没有换行符,因此是一行。

简单管道实现使用中间临时文件,所有输入都将被处理并馈送到该文件中。下一条命令可能正在另一个线程中运行,同时读取该文件,但它只是将流视为一个整体(尽管不完整),并且不知道馈送文件的块边界。即使管道是内存缓冲区,下一条命令也会将流视为一个整体。缺陷被深深地烙印了sed

为了使这种方法有效,您需要g在最后一个命令上使用一个选项,因此,它再次对大型文件造成阻塞。

底线是这样的:不要sed用来处理换行符。