用十六进制转换字符串的程序?

时间:2016-08-11 00:44:05

标签: python bash python-3.x

#!/usr/bin/python3

# -*- coding: utf-8 -*-

import os
import sys

try:
    string=sys.argv[1]
    cmd = "echo -n "+string+" | xxd -ps | sed 's/[[:xdigit:]]\{2\}/\\\\x&/g'"
    os.system(cmd)
except IndexError:
    print("\nInforme a string!\n")

我在互联网上找到了这个代码。我努力去理解它的作用。有人可以解释一下吗?

string=sys.argv[1]
cmd = "echo -n "+string+" | xxd -ps | sed 's/[[:xdigit:]]\{2\}/\\\\x&/g'"

上面两行对我来说就像魔术一样。

3 个答案:

答案 0 :(得分:3)

对于这一行:

cmd = "echo -n "+string+" | xxd -ps | sed 's/[[:xdigit:]]\{2\}/\\\\x&/g'"
  • echo将文本发送到标准输出
  • 输出到|
  • xxd个管道,它将二进制转换为十六进制(想想十六进制编辑器);根据{{​​1}}手册页:
  • -ps标志
xxd
  • -p | -ps | -postscript | -plain output in postscript continuous hexdump style. Also known as plain hexdump style. 是流编辑器命令 - 有关于此的字面上的书籍。基本上这里,sed命令的管道十六进制输出已执行此替换正则表达式,在此处细分:

    xxd -ps
  

\ XXX       生成或匹配十六进制ascii值为xx的字符。   (source

  • 简而言之,脚本接受输入并将其转换为十六进制,然后sed 's/ # Start find [[:xdigit]]\{2\} # Match two or more hexadecimal characters # ([[:xdigit:]] is POSIX-compliant representation # of hexadecimal character) / # End find, start replace \\\\x& # Lots of escaping backslashes - as \x&; the ampersand # becomes the entire previous match (the 2 hexadecimal # characters), e.g. '\x8e' /g' # End find, and g means all matches are changed 命令将它们转换为来自sed输入的每两个十六进制代码字符的ascii字符。

答案 1 :(得分:1)

此代码旨在从命令行执行。它接受传递给脚本的第一个参数并吐出以ASCII编码的字符串。让我们分解shell cmd,这样我们就能理解它是如何管理它的。

echo -n "+string+"

采用变量string(a.k.a。脚本的第一个参数)并输出它,通过管道将其传递给下一个命令。 (-n停止将换行符附加到字符串中。)

xxd -ps

将字符串转换为十六进制数字。 (-ps只是通过删除通常输出的一些附加信息将输出简化为十六进制数。)

sed 's/[[:xdigit:]]\{2\}/\\\\x&/g'

最后,字符串(现在是一个十六进制数字)被传送到sed s/.../.../g,它全局替换第一个和第二个斜杠之间的所有正则表达式,以及第二个和第三个斜杠之间的任何内容。在我们的例子中,该正则表达式是两个连续的十六进制数字(即0-9A-Fa-f)。此sed命令用于将\x添加到每对十六进制数字中(\\\\由于字符转义而被转换为输出中的\&在这一点上应插入任何被替换的信号。)因此,我们最终得到以ASCII编码的字符串,最后输出并打印出来。

答案 2 :(得分:1)

解释已由@Nick Bull和@pzp完成,在这里我只是想谈谈实施,它很简单,很难满足目的。

如果字符串包含不平衡报价(单引号或双引号),则原始代码将失败。

我想一段python代码可以更安全地完成它:

def charHex(ch):
    return hex(ord(ch))[1:]

hexStr = ''.join(map(charHex, string))