2

我有一个十六进制值的变量:在这个例子中,一个值为 0xfe 的字节:

echo $MYVAR | hexdump

0000000 0afe
0000002

我想在我的 bash 脚本上使用这个值,特别是我需要:

  1. 用作字符串(回声 X$MYVAR 应该给我 Xfe)

  2. 增加它,(0xff)

  3. 转换回原始格式(我需要保存增量值以备将来使用)

如果我将它转换为整数格式可能会更容易?

编辑:这是我初始化 var 的方式:

printf "\xfe" | dd bs=1 of=tempfile seek=8001
MYVAR=`dd if=tempfile skip=8001 count=1 bs=1`
4

2 回答 2

3

要将十六进制数字打印为字符串,您可以

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 中的文件读取的字节的十六进制值。
您现在可以使用 或其他方式直接打印echoprintf

$ echo $MYVAR
00fe

您可以如前所述对其进行数学运算:

$ printf %X $((0x$MYVAR + 1))
FF

感谢 fedorqui 的最短版本

问候。

于 2013-06-04T09:47:46.767 回答
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
于 2020-12-01T17:16:36.820 回答