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

将C语言uint指针操作代码移植到C#时遇到问题求助

正确移植C指针操作到C#的方案

首先,先拆解原C代码的核心逻辑,这样我们能准确对应到C#的实现:
原C代码是对rawptr这个指针进行字节偏移后,转换成不同类型的指针来访问内存数据,然后做位操作提取字段:

  • st是指向rawptr + 4位置的uint32_t指针,st[0]就是从该位置开始的第一个4字节无符号整数
  • d是指向rawptr + 8位置的uint64_t指针
  • 从st[0]的高8位提取err,再取err的低2位作为type,最后提取st[0]的低24位作为nybble

你现有C#代码的问题

你的转换代码存在几个关键错误,导致逻辑完全偏离原代码:

  • 错误地将rawptr强制转换为byte后做加法,这是数值运算而非内存偏移,完全不符合指针操作的逻辑
  • st被声明为uint[]数组,但赋值的是单个uint数值,类型不匹配
  • d被声明为ulong,但同样是赋值了一个偏移后的数值,而非对应内存位置的8字节数据

正确的移植方案

根据rawptr在C#中的存在形式,分两种常见场景实现:

场景1:rawptr是C#中的byte[]数组(最常用,比如从文件/网络读取的字节流)

这种情况不需要使用unsafe代码,用BitConverter类来解析字节数组即可:

// 假设rawptr是byte[]类型
// 从索引4开始读取4字节,转换为uint(对应原C代码的st[0])
uint st0 = BitConverter.ToUInt32(rawptr, 4);

// 提取err、type、nybble
byte err = (byte)(st0 >> 24);
byte type = (byte)((st0 >> 24) & 0x3);
uint nybble = st0 & 0x0FFFFFF;

// 从索引8开始读取8字节,转换为ulong(对应原C代码的d指针指向的数值)
ulong d = BitConverter.ToUInt64(rawptr, 8);

注意:BitConverter的字节序和当前系统一致,如果原C代码使用的是大端字节序(比如网络字节序),而当前系统是小端,需要手动反转字节:

// 处理大端字节序的st0
byte[] stBytes = rawptr.Skip(4).Take(4).Reverse().ToArray();
uint st0 = BitConverter.ToUInt32(stBytes, 0);
// d的处理同理
byte[] dBytes = rawptr.Skip(8).Take(8).Reverse().ToArray();
ulong d = BitConverter.ToUInt64(dBytes, 0);

场景2:rawptr是IntPtr(比如调用非托管API获取的指针)或必须使用指针操作

如果需要模拟C的指针逻辑,可以使用C#的unsafe代码块:

// 情况A:rawptr是byte[]数组
unsafe
{
    fixed (byte* rawPtr = rawptr)
    {
        uint* st = (uint*)(rawPtr + 4);
        ulong* d = (ulong*)(rawPtr + 8);
        
        byte err = (byte)(st[0] >> 24);
        byte type = (byte)((st[0] >> 24) & 0x3);
        uint nybble = st[0] & 0x0FFFFFF;
        
        // 这里可以直接使用st和d指针访问后续元素,比如st[1]、d[1]等
    }
}

// 情况B:rawptr是IntPtr
unsafe
{
    byte* rawPtr = (byte*)rawptr.ToPointer();
    uint* st = (uint*)(rawPtr + 4);
    ulong* d = (ulong*)(rawPtr + 8);
    
    // 后续位操作和上面完全一致
}

注意:使用unsafe代码需要在项目设置中开启"允许不安全代码"选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:09:17