我需要在有符号整数和它们作为一系列字节的内部表示之间进行转换。在 C 中,我使用了如下函数:unsigned char hibyte(unsigned short i){return i>>8;}unsigned char lobyte(unsigned short i){return i & 0xFF;}unsigned short makeshort(unsigned char hb, unsigned char lb){return ((short)hb << 8) | (short)lb;}问题是这段代码在 C# 下不起作用,因为有符号/无符号强制转换的规则不一样:据我所知,C# 强制转换意味着值的转换,而在 C# 有符号/无符号类型之间的转换不会修改底层数据.此外,在 C# 中,对于有符号数,>> 运算符在符号位中移位。所有这些都使我很难将代码转换为 C#,例如1)C#函数public static byte hibyte(short i){return (byte) (i>>8);}如果 i 为负,则抛出溢出异常2)C#函数public static ushort makeshort(byte hb, byte lb){return (short) (((ushort)hb << 8) | (ushort)lb); }如果结果 short 为负,则引发溢出异常。这里表达式 "(ushort)hb 最佳答案 几个答案已经注意到 BitConverter 类,以及使用 unchecked 与位移和强制转换。我将快速演示第三个选项:“C 风格联合结构”。[StructLayout(LayoutKind.Explicit)]struct Converter{ [FieldOffset(0)] public ushort UshortValue; [FieldOffset(0)] public short ShortValue; [FieldOffset(0)] public byte LoByte; [FieldOffset(1)] public byte HiByte;}然后像这样使用。ushort test1 = new Converter { ShortValue = -123 }.UshortValue; // 65413ushort test2 = new Converter { HiByte = 1, LoByte = 100 }.UshortValue; // 356byte test3 = new Converter { UshortValue = 356 }.LoByte; // 100与 BitConverter 相比,它的优势在于您不需要分配临时字节数组。关于C# 签名/未签名强制转换问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33369320/
10-11 11:24