【问题标题】:How to get a inverse hexadecimal string from a hexadecimal string in shell如何从shell中的十六进制字符串获取反十六进制字符串
【发布时间】:2019-08-28 11:13:04
【问题描述】:

我对十六进制字符串进行了如下练习

#!/bin/bash
HEX_STR="0001020355AA55AA"

## get ${INVERSE_HEX_STR}
## idea 1: echo ${HEX_STR} | xxd -r -p > ${BIN_FILE}, how to inverse ${BIN_FILE} ?


echo "inverse ${HEX_STR} is ${INVERSE_HEX_STR}"

如何获取保存到 ${INVERSE_HEX_STR} 的逆值

所以输出是:

inverse 0001020355AA55AA is FFFEFDFCAA55AA55

【问题讨论】:

    标签: shell hex inverse


    【解决方案1】:

    使用tr:


    #!/bin/bash
    HEX_STR="0001020355AA55AA"
    
    INVERSE_HEX_STR=`echo -n ${HEX_STR}|tr '0123456789ABCDEF' 'FEDCBA9876543210'`
    
    echo "inverse ${HEX_STR} is ${INVERSE_HEX_STR}"
    

    【讨论】:

    • 我也注意到了。 ;)
    【解决方案2】:

    在算术上下文中使用 bash 内置 xor ^ 运算符并定义函数:

    f() { 
       hex=$((0x$1))
       printf "inverse %X is %X\n" $hex $((hex ^ 0xFFFFFFFFFFFFFFFF))
    }
    

    你可以像这样使用它:

    f 0001020355AA55AA
    inverse 1020355AA55AA is FFFEFDFCAA55AA55
    

    【讨论】:

    • 你有一个固定长度的赞美。 f 0 返回FFFFFFFFFFFFFFFF,这似乎不太正确。 f () { HEX_STR="$1"; len=${#HEX_STR}; hex=$((0x$1)); comp="0x$( while ((len--)); do printf "F"; done )"; printf "inverse $HEX_STR is %X\n" $(( 0x$HEX_STR ^ comp )) } 怎么样?
    • 不过,我喜欢它是全内部的 bash。
    • 它可以根据 HEX_STR 获得正确的赞美,但奇怪的是输出总是 16 个字符的字符串反 0001020355aa55aa0123456789abcdef 是 FEDCBA9876543210
    猜你喜欢
    • 2019-07-27
    • 2010-10-04
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多