#!/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'"
上面两行对我来说就像魔术一样。
答案 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-9
,A-F
或a-f
)。此sed
命令用于将\x
添加到每对十六进制数字中(\\\\
由于字符转义而被转换为输出中的\
和&
在这一点上应插入任何被替换的信号。)因此,我们最终得到以ASCII编码的字符串,最后输出并打印出来。
答案 2 :(得分:1)
解释已由@Nick Bull和@pzp完成,在这里我只是想谈谈实施,它很简单,很难满足目的。
如果字符串包含不平衡报价(单引号或双引号),则原始代码将失败。
我想一段python代码可以更安全地完成它:
def charHex(ch):
return hex(ord(ch))[1:]
hexStr = ''.join(map(charHex, string))