需要一个shell脚本将big endian转换为little endian

Raj*_*jiv 6 bash shell endianness

我需要一个shell脚本程序来打印从big endian到little endian的十六进制数

例如

  • 输入: my virtual address = 00d66d7e
  • 输出: 7e6dd600

我怎样才能在bash脚本中创建它?

Kar*_*ath 13

对于32位地址,假设它为零填充:

v=00d66d7e 
echo ${v:6:2}${v:4:2}${v:2:2}${v:0:2}
# 7e6dd600
Run Code Online (Sandbox Code Playgroud)


hut*_*ano 12

根据Karoly的回答,您可以使用以下脚本,阅读管道输入:

#!/bin/bash

# check stdin
if [ -t 0 ]; then exit; fi

v=`cat /dev/stdin`
i=${#v}

while [ $i -gt 0 ]
do
    i=$[$i-2]
    echo -n ${v:$i:2}
done

echo
Run Code Online (Sandbox Code Playgroud)

例如,您可以将此脚本保存为endian.sh并使其可执行:

chmod u+x endian.sh
Run Code Online (Sandbox Code Playgroud)

然后:

echo 00d66d7e | ./endian.sh
Run Code Online (Sandbox Code Playgroud)

给你:

7e6dd600
Run Code Online (Sandbox Code Playgroud)

对于不同长度的字符串:

echo d76f411475428afc90947ee320 | ./endian.sh
Run Code Online (Sandbox Code Playgroud)

结果将是:

20e37e9490fc8a427514416fd7
Run Code Online (Sandbox Code Playgroud)


Bri*_*man 10

只是不得不这样做...但从十进制到小端..在这里适应:

echo 00d66d7e | tac -rs .. | echo "$(tr -d '\n')"
Run Code Online (Sandbox Code Playgroud)

对于无符号整数的任意大小的十六进制表示,实现了期望的结果.

(h/t'tac -rs'MestreLion,非常好!)

  • *非常*聪明的解决方案,+ 1!我可以建议改进吗?`tac`,或者至少是GNU`tac`,接受正则表达式作为分隔符,因此不需要grep:`echo"AABBCC"| tac -rs ..` (3认同)
  • 非常好的解决方案。我更喜欢`echo -n 00d66d7e | tac-rs ..; 回声`但我想这只是味道。 (2认同)