2015-04-06 129 views
0

我有一个问题,我无法整天解决。我是C#的新手,我要求你帮我一把。结合两个ulong值并将其转换为字节数组

我有两个ulong值。我需要组合它们的二进制表示并获得16个字节的值。我知道C#不支持128位类型。但我也不需要在变量中保存这个值。我需要将此值转换为字节数组。 我试图值这样的组合:

long a = ((long)b << 64) + (long)c; 

和转换后BitConverter到字节数组。

但我意识到这是不正确的,因为长值的大小是8个字节。 我不想创建一个128类型来获得结果。

那么有没有办法结合并直接添加到字节数组?

感谢

+0

'BitConverter'可以从偏移量的字节数组中读取,但不幸的是没有任何函数可以写入字节数组中的偏移量:( – 2015-04-06 05:57:21

回答

0

如果我运行此:

var x = (ulong)1; 
var y = (ulong)2; 

var result = 
    BitConverter.GetBytes(x) 
     .Concat(BitConverter.GetBytes(y)) 
     .ToArray(); 

我得到这个:

result

这是你想要的吗?

2

Microsoft C#支持使用BigInteger任意长度的整数。你可以结合你的两个值,如例子中你给,就像这样:

BigInteger a = b; 
a <<= 64; 
a += c; 

然而,当你indiciated你并不需要保存这个值。在你提到之前,是的,我知道排序。有机器依赖的排序和线上排序。我们不应该试图产生任何依赖机器的排序......我们可以用我最熟悉的语言产生线上排序的方式是使用右移和模运算符,至少对于未签名的类型。签名类型介绍了编码标志的复杂性,但这里有一个例子,我认为你可能受益于:

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  ) }; 
+0

好点,我现在会进行更正 – Sebivor 2015-04-06 06:38:01

+0

似乎它是我需要什么......谢谢,但是你知道如何在pl sql中得到相同的结果吗?我需要比较结果。 – stilhead 2015-04-06 08:15:40

+0

很好,我打算表达我对代码缺乏完全信心。 ,@BenVoigt。你有什么建议吗? – Sebivor 2015-04-06 23:28:59

0

我猜它的功课? 您可以表示您的术语,ulongs a和b为字节数组。 之后,您可以为总和创建一个新的字节数组c。 对于每一个字节都是逐位进位,只是做一个正常的二进制补码二进制加法,记住从字节到字节的进位位。 如果最后一个字节有进位,那么你应该抛出某种类型的“ulong addition overflow exception”。

相关问题