我有一个带十六进制值的变量:在本例中,一个值为0xfe的字节:
echo $MYVAR | hexdump
0000000 0afe
0000002
我想在我的bash脚本上使用这个值,特别是我需要:
用作字符串(echo X $ MYVAR应该给我Xfe)
增加它,(0xff)
转换回原始格式(我需要保存递增的值以备将来使用)
如果我把它转换成整数格式可能会更容易吗?
编辑:这是我如何初始化var:
printf "\xfe" | dd bs=1 of=tempfile seek=8001
MYVAR=`dd if=tempfile skip=8001 count=1 bs=1`
答案 0 :(得分:2)
要将十六进制数字打印为字符串,您可以
printf 0x%X $MYVAR
将其递增并以十六进制形式打印回来,例如
printf 0x%X `echo $(( 0xfe + 1 ))`
对于“转换回”原始格式,我认为您的意思是保留整数值,在这种情况下,您只需使用$MYVAR
而不进行格式转换。
希望这有帮助,
问候。
编辑:
要关注您的问题编辑,我将在下面添加我的答案。
你可以用这种方式设置MYVAR:
read dummy MYVAR <<EOF
`dd if=tempfile skip=8001 count=1 bs=1|od -x`
EOF
现在您有从MYVALUE中存储的文件中读取的字节的十六进制值
您现在可以使用echo
,printf
或其他任何内容直接打印。
$ echo $MYVAR
00fe
如前所述,您可以对其进行数学运算:
$ printf %X $((0x$MYVAR + 1))
FF
(感谢fedorqui的最短版本)
问候。
答案 1 :(得分:0)
假设您的流表示不断变化的数字参数,则可以通过hexdump或coreutils中的od对其进行转换。注意,强烈建议将stdbuf用于实时流处理。
# Print decimal byte values per line
stdbuf -oL hexdump -v -e '1/1 "%u\n"'
# Floating point values
stdbuf -oL hexdump -v -e '1/4 "%f\n"'
使用coreutils中的od进行输入字节校正:
# unsigned 8-bit
stdbuf -oL od -v -An -w7 -tu1 --endian=little
# signed 32-bit
stdbuf -oL od -v -An -w4 -tu4 --endian=little
# Float 32-bit
stdbuf -oL od -v -An -w4 -tf4 --endian=little
除非存在字节性问题,否则由于具有良好的格式支持,hexdump可能更可取-几乎就像printf:
cat /dev/urandom \
| stdbuf -oL hexdump -v -e '1/4 "%i" 1/4 " %i" 1/4 " %f\n"' \
| stdbuf -oL awk '{ print "("$1" + "$2") * "$3" = ", $1 + $2 * $3 }'
例如一些毫无意义的8位流数学
# Replace the >/dev/null safeguard to actually try it
cat /dev/urandom \
| stdbuf -oL hexdump -e '1/1 " %i" 1/1 " %i" "\n"' \
| {
while read a b; do
r=$(( (a + b) / 2 ))
printf "printf \"\%03o\"" $r
done
} | sh >/dev/null