我尝试在bash中回显整数,而不是将每个数字转换为ASCII并输出相应的序列。例如:
echo "123" | hd
00000000 31 32 33 0a |123.|它输出每个字符的ASCII码。我如何输出123本身,例如作为无符号整数?这样我就能得到这样的东西
00000000 0x7B 00 00 00发布于 2016-12-14 10:04:39
这是printf的工作
$ printf "\x$(printf '%x' "123")" | hd
00000000 7b |{|内部printf将十进制数字123转换为十六进制,外部printf使用\x创建具有该值的字节。
如果您想要几个字节,请使用以下命令:
$ printf '%b' "$(printf '\\x%x' "123" "96" "68")" | hd
00000000 7b 60 44 |{`D|或者,如果您想使用十六进制:
$ printf '%b' "$(printf '\\x%x' "0x7f" "0xFF" "0xFF")" | hd
00000000 7f ff ff |...|或者,在这种情况下,简单地:
$ printf '\x7f\xFF\xFF' | hd
00000000 7f ff ff |...|发布于 2016-12-15 01:57:52
您必须注意字节顺序。x86为little endian,因此必须首先存储最低有效字节。
例如,如果您想要在磁盘上存储32位整数: 2'937'252'660d = AF'12'EB'34h,则必须依次写入: 0x34、0xEB、0x12和0xAF。
就是将这个helper用于与您相同的目的:
printf "%.4x\n" 2937252660 | fold -b2 | tac | while read a; do echo -e -n "\\x${a}"; doneprintf从十进制改为十六进制
fold按2个字符组拆分,即1个字节
tac反转行(这是应用little-endian的地方)
while循环一次回显一个原始字节
发布于 2016-12-15 04:48:28
借用@Setop's answer的观察结果,示例表明OP需要uint32s,但试图构建更有效的实现(不涉及subshell或外部命令):
print_byte() {
local val
printf -v val '%02x' "$1"
printf '%b' "\x${val}"
}
print_uint32() {
print_byte "$(( ( $1 / (( 256 ** 0 )) ) % 256 ))"
print_byte "$(( ( $1 / (( 256 ** 1 )) ) % 256 ))"
print_byte "$(( ( $1 / (( 256 ** 2 )) ) % 256 ))"
print_byte "$(( ( $1 / (( 256 ** 3 )) ) % 256 ))"
}因此:
print_uint32 32 | xxd # this should be a single space, padded with nulls...correctly收益率:
00000000: 2000 0000 ......as演示了如何通过Python struct.unpack()模块反转回原始值:
$ print_uint32 32 |
> python -c 'import struct, sys; print struct.unpack("I", sys.stdin.read())'
32https://stackoverflow.com/questions/41133591
复制相似问题