微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将二进制数据转换为hex的shell脚本?

感觉有点愚蠢的问这个(听起来很基础),但在其他地方找不到答案。 我想将二进制数据转换为hex,只是,没有花哨的格式和所有。 hexdump看起来太聪明了,对我来说“过分的格式化”。 我想从/ dev / random中获取x个字节,并以hex的forms传递它们。

最好我只使用标准的Linux工具,所以我不需要在每台机器上安装它(有很多)

PowerShell脚本获取目录总大小

如何在运行batch file时防止失败程序(.exe)的错误popup消息框

Ruby:从bash脚本运行脚本?

如何从cmd.exe打开指定目录中的资源pipe理器窗口?

Powershell开始抄录错误

也许使用xxd :

% xxd -l 16 -p /dev/random 193f6c54814f0576bc27d51ab39081dc

小心!

hexdump和xxd给出了不同的排序结果!

$ echo -n $'x12x34' | xxd -p 1234 $ echo -n $'x12x34' | hexdump -e '"%x"' 3412

http://geekandpoke.typepad.com/.a/6a00d8341d3df553ef01543533e604970c-800wi:D

用od(GNU系统):

$ echo abc | od -A n -v -t x1 | tr -d ' n' 6162630a

用hexdump(BSD系统):

$ echo abc | hexdump -ve '/1 "%02x"' 6162630a

从http://en.wikipedia.org/wiki/Hex_dump#od_and_hexdump :

“根据你的系统类型,这两个工具中的任何一个或两个都可用 – BSD系统反对hexdump,GNU系统反过来。”

也许你可以用C编写你自己的小工具,然后在编译的时候:

int main (void) { unsigned char data[1024]; size_t numread,i; while ((numread = read(0,data,1024)) > 0) { for (i = 0; i < numread; i++) { printf("%02x ",data[i]); } } return 0; }

然后从标准输入中输入:

cat /bin/ls | ./a.out

您甚至可以使用heredoc语法将这个小C程序嵌入到shell脚本中。

所有的解决方案似乎很难记住或太复杂,我发现使用printf最短的一个

$ printf '%xn' 256 100

[编辑]

但正如在评论中指出的那样,这不是作者想要的,所以在下面是公正的答案。

…使用以上输出实际的二进制数据流:

printf '%xn' $(cat /dev/urandom | head -c 5 | od -An -vtu1)

它能做什么:

printf'%x n'…. – 打印一个整数序列,即。 printf '%x,' 1 2 3 ,将打印1,2,3,

$(…) – 这是获取某些shell命令的输出并处理它的一种方法

cat /dev/urandom – 它输出随机的二进制数据

head -c 5 – 将二进制数据限制为5个字节

od -An -vtu1 – 八进制转储命令,将二进制转换为十进制

作为一个测试用例('a'是61十六进制,'p'是70 hex,…):

$ printf '%xn' $(echo "apple" | head -c 5 | od -An -vtu1) 61 70 70 6c 65

或测试单个二进制字节,在输入上给出61十进制('='char)来产生二进制数据( '\x%x'格式),上面的命令将正确输出3d(十进制61):

$printf '%xn' $(echo -ne "$(printf '\x%x' 61)" | head -c 5 | od -An -vtu1) 3d

dd + hexdump也将工作:

dd bs=1 count=1 if=/dev/urandom 2>/dev/null | hexdump -e '"%x"'

如果你需要一个大的流(没有换行符),你可以使用tr和xxd (vim的一部分)进行逐字节的转换。

head -c1024 /dev/urandom | xxd -p | tr -d $'n'

或者你可以使用hexdump (posix)进行逐字转换。

head -c1024 /dev/urandom | hexdump '-e"%x"'

请注意,区别在于字节序。

这三个命令将打印相同(0102030405060708090a0b0c):

n=12 echo "$a" | xxd -l "$n" -p echo "$a" | od -N "$n" -An -tx1 | tr -d " n" ; echo echo "$a" | hexdump -n "$n" -e '/1 "%02x"'; echo

假设n=12 , $a是从1到26的字节值:

a="$(printf '%b' "$(printf '\0%o' {1..26})")"

这可以用来在每个程序中获得$n随机字节值:

xxd -l "$n" -p /dev/urandom od -vN "$n" -An -tx1 /dev/urandom | tr -d " n" ; echo hexdump -vn "$n" -e '/1 "%02x"' /dev/urandom ; echo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐