Bash中$(( ))结构能否支持128位十六进制数的异或运算?
在Bash中处理128位十六进制数的异或运算
Bash的$(( ))结构无法直接处理128位整数——它依赖系统原生的整数类型(通常为64位),超过范围的数值会被截断,因此你得到的是截断后的64位异或结果。
以下是两种可行的替代方案:
方案1:逐字符异或
十六进制的每一位对应4位二进制,异或运算可以逐位独立完成。遍历两个字符串的每一对字符,分别计算异或后拼接结果:
x=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA y=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF result="" for ((i=0; i<${#x}; i++)); do # 提取单个字符并转为十进制 x_digit=$((16#${x:i:1})) y_digit=$((16#${y:i:1})) # 计算异或并转回十六进制字符 xor_digit=$((x_digit ^ y_digit)) result+=$(printf "%X" "$xor_digit") done echo "0x$result"
执行后会输出0x55555555555555555555555555555555,完全匹配128位的预期结果。
方案2:分块处理64位段
将128位字符串拆分为两个64位的子串(各16个十六进制字符),分别用$(( ))处理后拼接结果:
x=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA y=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF # 拆分高64位和低64位 x_high=${x:0:16} x_low=${x:16:16} y_high=${y:0:16} y_low=${y:16:16} # 分别计算异或 xor_high=$((16#$x_high ^ 16#$y_high)) xor_low=$((16#$x_low ^ 16#$y_low)) # 格式化输出,确保每个块补全16位(避免前导零丢失) printf "0x%016X%016X\n" "$xor_high" "$xor_low"
这种方法利用Bash对64位整数的支持,拆分后运算,结果同样符合预期。
内容的提问来源于stack exchange,提问作者Rusty Lemur
相关产品推荐
相关产品推荐

