You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:25:12