有人请解释为什么这个脚本有时会以十六进制字符串表示形式返回15个字节吗?
for i in {1..10}; do
API_IV=`openssl rand 16`; API_IV_HEX=`echo -n "$API_IV" | od -vt x1 -w16 | awk '{$1="";print}'`; echo $API_IV_HEX;
done
像这样:
c2 2a 09 0f 9a cd 64 02 28 06 43 f8 13 80 a5 04
fa c4 ac b1 95 23 7c 36 95 2d 5e 0e bf 05 fe f4
38 55 d3 b4 32 bb 61 f4 fd 17 92 67 e2 9b b4 04
6d a7 f8 46 e9 99 bd 89 87 f9 7f 2b 15 5a 17 8a
11 c8 89 f4 8f 66 93 f1 6d b9 2b 64 7e 01 61 68
93 e3 9d 28 95 e1 c8 92 e5 62 d9 bf 20 b3 1c dd
37 64 ef b0 2f da c7 60 1c c8 20 b8 28 9d f9
29 f0 5a e9 cc 36 66 de 02 82 fc 8e 36 bf 5d d1
b2 57 d8 79 21 df 73 1c af 07 e9 80 0a 67 c6 15
ba 77 cb 92 39 42 39 f9 a4 57 c8 c4 be 62 19 54
如果管道" openssl rand 16"直接到od命令然后它工作正常,但我需要二进制值。谢谢你的帮助。
答案 0 :(得分:4)
echo
将\x00
视为字符串结束标记。所以在它之后停止显示。
也许您正在寻找-hex
的{{1}}选项:
openssl rand
鉴于您的系统上有该选项,您的示例可以重写:
sh$ openssl rand 16 -hex
4248bf230fc9dd927ab53f799e2a9708
如果您需要稍后从 hex转换为字节,请使用此sh$ openssl version
OpenSSL 1.0.1e 11 Feb 2013
sh$ for i in {1..10}; do
openssl rand 16 -hex | sed -e 's|..|& |g' -e 's| $||'
done
20 cb 6b 7a 85 2d 0b fe 9e c7 d0 4b 91 88 1b bb
5d 74 99 5e 05 c9 7d 9d 37 dd 02 f3 23 bb c5 b7
51 e9 0f dc 58 04 5e 30 e3 6b 9f 63 aa fc 95 05
fc 6b b8 cb 05 82 53 85 78 0e 59 13 3b e7 c1 4b
cf fa fc d9 1a 25 df e0 f8 59 71 a6 2c 64 c5 87
93 1a 29 b4 5a 52 77 bb 3f bb 1d 0a 46 5d c8 b4
0c bb c2 b2 b4 89 d4 37 1c 86 0a 7a 58 b8 64 e2
ee fc a7 ec 6c f8 7f 51 04 43 d6 00 d8 79 65 43
b9 73 9e cc 4b 42 9e 64 9d 5b 21 6a 20 b7 c3 16
06 8a 15 22 6a d5 ae ab 9a d2 9f 60 f1 a9 26 bd
单行:
perl
(来自https://stackoverflow.com/a/1604770/2363712)
请注意我管道到客户端程序,而不是在这里使用shell变量,因为我认为它无法正确处理echo MY_HEX_STRING |
perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie' |
my_tool_reading_binary_input_from_stdin
。
由于 bash无法正确处理包含\x00
的二进制字符串,如果您绝对想要坚持使用shell编程,最好的办法就是使用中间文件来存储二进制数据。 不变量:
这是的想法。随意适应您的需求:
\x00
作为个人观点,如果你真的有很多二进制数据处理,我建议切换到更多面向数据的其他语言(Python,...)
答案 1 :(得分:2)
因为丢失的字节是ASCII NUL '\0'
' \x00'
。当echo
命令遇到每个参数中的空字节时,它会停止打印其参数。