首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中按整数序号发出字符(或多字节二进制字符串)

在bash中按整数序号发出字符(或多字节二进制字符串)
EN

Stack Overflow用户
提问于 2016-12-14 09:58:14
回答 3查看 174关注 0票数 1

我尝试在bash中回显整数,而不是将每个数字转换为ASCII并输出相应的序列。例如:

代码语言:javascript
复制
echo "123" | hd
00000000  31 32 33 0a                                       |123.|

它输出每个字符的ASCII码。我如何输出123本身,例如作为无符号整数?这样我就能得到这样的东西

代码语言:javascript
复制
00000000  0x7B 00 00 00
EN

回答 3

Stack Overflow用户

发布于 2016-12-14 10:04:39

这是printf的工作

代码语言:javascript
复制
$ printf "\x$(printf '%x' "123")" | hd
00000000  7b                                                |{|

内部printf将十进制数字123转换为十六进制,外部printf使用\x创建具有该值的字节。

如果您想要几个字节,请使用以下命令:

代码语言:javascript
复制
$ printf '%b' "$(printf '\\x%x' "123" "96" "68")" | hd
00000000  7b 60 44                                          |{`D|

或者,如果您想使用十六进制:

代码语言:javascript
复制
$ printf '%b' "$(printf '\\x%x' "0x7f" "0xFF" "0xFF")" | hd
00000000  7f ff ff                                          |...|

或者,在这种情况下,简单地:

代码语言:javascript
复制
$ printf '\x7f\xFF\xFF' | hd
00000000  7f ff ff                                          |...|
票数 2
EN

Stack Overflow用户

发布于 2016-12-15 01:57:52

您必须注意字节顺序。x86为little endian,因此必须首先存储最低有效字节。

例如,如果您想要在磁盘上存储32位整数: 2'937'252'660d = AF'12'EB'34h,则必须依次写入: 0x34、0xEB、0x12和0xAF。

就是将这个helper用于与您相同的目的:

代码语言:javascript
复制
printf "%.4x\n" 2937252660 | fold -b2 | tac | while read a; do echo -e -n "\\x${a}"; done

printf从十进制改为十六进制

fold按2个字符组拆分,即1个字节

tac反转行(这是应用little-endian的地方)

while循环一次回显一个原始字节

票数 1
EN

Stack Overflow用户

发布于 2016-12-15 04:48:28

借用@Setop's answer的观察结果,示例表明OP需要uint32s,但试图构建更有效的实现(不涉及subshell或外部命令):

代码语言:javascript
复制
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 ))"
}

因此:

代码语言:javascript
复制
print_uint32 32 | xxd # this should be a single space, padded with nulls

...correctly收益率:

代码语言:javascript
复制
00000000: 2000 0000                                ...

...as演示了如何通过Python struct.unpack()模块反转回原始值:

代码语言:javascript
复制
$ print_uint32 32 |
>   python -c 'import struct, sys; print struct.unpack("I", sys.stdin.read())'
32
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41133591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档