Java中字节位旋转实现:SHA-3规范right_encode的int转byte问题
SHA-3 right_encode 字节位反转实现方案
你需要的是字节位反转操作,将标准位序(最右侧为最低位)的字节转换为NIST SHA-3规范要求的左位为低位的格式。比如数值1对应的标准字节是0000 0001,反转后需变为1000 0000。
以下两种实现方法可以满足需求:
方法一:手动位操作(通用实现)
通过循环逐个提取原字节的每一位,将其放到反转后的对应位置:
public static byte reverseBits(byte b) { int reversed = 0; for (int i = 0; i < 8; i++) { // 提取原字节第i位(从右往左数),放到反转后的第(7-i)位 reversed |= ((b >> i) & 1) << (7 - i); } return (byte) reversed; }
使用示例:
int n = 1; byte originalByte = (byte) n; // 对应二进制 0000 0001 byte reversedByte = reverseBits(originalByte); // 对应二进制 1000 0000
方法二:查表法(高效实现)
如果需要频繁调用该操作,预存所有256种字节的反转值,直接查表能显著提升效率:
// 预生成所有字节的位反转值表 private static final byte[] REVERSE_BIT_TABLE = new byte[256]; static { for (int i = 0; i < 256; i++) { int reversed = 0; int val = i; for (int j = 0; j < 8; j++) { reversed |= ((val >> j) & 1) << (7 - j); } REVERSE_BIT_TABLE[i] = (byte) reversed; } } public static byte reverseBitsLookup(byte b) { // 将有符号byte转为无符号int作为索引 return REVERSE_BIT_TABLE[b & 0xFF]; }
使用示例:
int n = 1; byte originalByte = (byte) n; byte reversedByte = reverseBitsLookup(originalByte); // 得到 1000 0000
补充说明
在SHA-3的right_encode函数中,除了单个字节的位反转,还需遵循规范的编码结构:先按左位为低位的顺序编码数值的二进制位,再追加一个表示数值二进制长度的字节(同样需位反转)。
内容的提问来源于stack exchange,提问作者Pocket
相关产品推荐
相关产品推荐

