我有一个问题,我整天都无法解决。我是C#的新手,我要求你帮我一把。
我有两个ulong值。我需要结合他们的二进制表示并获得16个字节的值。我知道C#不支持128位类型。但我也不需要在变量中保存这个值。我需要将此值转换为字节数组。 我试图结合这样的值:
long a = ((long)b << 64) + (long)c;
并在使用BitConverter转换为字节数组之后。
但我意识到这是不正确的,因为长值的大小是8字节。 我不想创建128类型来获得结果。
那么有没有办法直接组合并添加到字节数组?
由于
答案 0 :(得分:2)
Microsoft C#使用BigInteger
支持任意长度的整数。您可以将两个值组合在一起,例如在您给出的示例中,如下所示:
BigInteger a = b;
a <<= 64;
a += c;
但是,正如您所指出的,您不需要存储此值。在你提到之前,是的,我知道字节序。这是依赖于机器的字节顺序和线上字节序。我们不应该尝试产生任何依赖于机器的字节序...我们最熟悉的语言中我们可以使用右移和模运算符来生成线上字节序,至少对于无符号类型。签名类型引入了编码符号的复杂性,但这是一个我认为您可能会从中受益的示例:
byte[] array = { (byte)(b >> 56), (byte)(b >> 48), (byte)(b >> 40), (byte)(b >> 32),
(byte)(b >> 24), (byte)(b >> 16), (byte)(b >> 8), (byte)(b ),
(byte)(c >> 56), (byte)(c >> 48), (byte)(c >> 40), (byte)(c >> 32),
(byte)(c >> 24), (byte)(c >> 16), (byte)(c >> 8), (byte)(c ) };
答案 1 :(得分:0)
如果我这样做:
var x = (ulong)1;
var y = (ulong)2;
var result =
BitConverter.GetBytes(x)
.Concat(BitConverter.GetBytes(y))
.ToArray();
我明白了:
这就是你想要的吗?
答案 2 :(得分:0)
我猜它的功课? 您可以表示您的术语,ulongs a和b作为字节数组。 之后,您可以为总和创建一个新的字节数组c。 对于每个字节一点一点地进行,只需要进行正常的二进制补码二进制加法,记住从一个字节到另一个字节的进位。 如果最后一个字节有进位,那么你应该抛出某种“ulong addition overflow exception”。