gpt4 book ai didi

C# 签名/未签名转换问题

转载 作者:行者123 更新时间:2023-11-30 13:55:32 25 4
gpt4 key购买 nike

我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 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); }

如果结果为负,则抛出溢出异常。这里表达式“(ushort)hb << 8”起作用是因为移位是在无符号数上完成的。但是后来我需要将相同的数据解释为带符号的整数,但我不知道该怎么做。我理解 C# 这样的类 C 转换是作弊,因为正值可能变成负值,但这是我真正需要的(例如,用于处理从设备读取的字节流等)。目前我正在使用C 代码编译为非托管 dll,用于所有像这样的二进制操作,但这不是很优雅,我相信这可以在 C# 中以某种方式(可能简单地)完成。欢迎提出任何建议!

最佳答案

几个答案已经注意到 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; // 65413
ushort test2 = new Converter { HiByte = 1, LoByte = 100 }.UshortValue; // 356
byte test3 = new Converter { UshortValue = 356 }.LoByte; // 100

BitConverter 相比,它的优势在于您无需分配临时字节数组。

关于C# 签名/未签名转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33369320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com