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

32位数字打包与解包:C#文件偏移量计算求助

正确的C#实现方案

根据你提供的文档规则,我们可以通过位运算精准实现偏移量的解包,避免加法带来的溢出或位重叠问题。以下是完整实现:

// 假设bytes是从文件中读取的4字节偏移量数据,顺序为byte0、byte1、byte2、byte3
// (注:文档中byte1未参与计算,直接忽略即可)
uint UnpackOffset(byte[] bytes)
{
    if (bytes.Length != 4)
        throw new ArgumentException("偏移量必须是4字节数据");

    uint offset = 0;

    // 提取byte3的高半字节dddd,放到最终偏移量的第23-20位
    offset |= (uint)(((bytes[3] >> 4) & 0x0F) << 20);

    // 提取byte0的高半字节aaaa,放到最终偏移量的第19-16位
    offset |= (uint)(((bytes[0] >> 4) & 0x0F) << 16);

    // 提取byte0的低半字节aaaa,放到最终偏移量的第15-12位
    offset |= (uint)((bytes[0] & 0x0F) << 12);

    // 提取byte2的高半字节cccc,放到最终偏移量的第11-8位
    offset |= (uint)(((bytes[2] >> 4) & 0x0F) << 8);

    // 提取byte2的低半字节cccc,放到最终偏移量的第7-4位,低位补4个0
    offset |= (uint)((bytes[2] & 0x0F) << 4);

    return offset;
}

代码对应文档规则的说明

  1. 提取高半字节并组合:从第四个字节(bytes[3])中取出高4位dddd,从第一个字节(bytes[0])取出完整的8位aaaaaaaa,第三个字节(bytes[2])取出完整的8位cccccccc,组合成dddd aaaaaaaa cccccccc。
  2. 低位补0对齐:在组合后的20位数据末尾添加4个0,形成24位数据dddd aaaaaaaa cccccccc 0000。
  3. 补高8位为0:最终32位偏移量的高8位固定为0,通过uint的默认初始化(高位为0)自动满足。

为什么之前的代码会失效

你参考的代码使用了加法(+)而非位运算(|),当数值较大时,不同位段的加法会产生进位,破坏原本的位结构。而位运算直接操作二进制位,各段位不重叠,不会出现进位干扰,能准确还原偏移量。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 20:24:31