2011-04-13 74 views
21

动机: 我想将哈希值(MD5/SHA1等)转换为十进制整数,以便在Code128C中生成条码。 为了简单起见,我更倾向于所有由此产生的(大)数字。byte []为无符号BigInteger?

我能字节[]转换为BigInteger的在C#...我得从什么到目前为止
样品:

byte[] data; 
byte[] result; 
BigInteger biResult; 

result = shaM.ComputeHash(data); 
biResult = new BigInteger(result); 

但是(在这里生锈CS)我在纠正一个字节数组可以总是解释在两个方面: 答:作为一个符号数 B:作为一个无符号数

是否有可能在C#中的字节[]做出UNSIGNED BigInteger的?

我应该简单地在字节[]的前面添加一个0x00(零字节)吗?

编辑: 谢谢AakashM,乔恩和亚当·罗宾逊,附加一个零字节实现我需要什么样的\

EDIT2: 我应该做的主要事情是阅读BigInteger的详细文档(byte [])构造函数,那么我会看到关于如何通过追加零字节来限制正数的部分。

+1

您应该标记接受的答案 – 2012-05-03 17:19:29

回答

32

remarks for the BigInteger constructor状态,你可以确保从byte[]创建的任何BigInteger是无符号。

注意:BigInteger构造函数期望数组处于little-endian顺序。请记住,如果您希望得到的BigInteger具有特定的值。

5

但是(在这里生锈CS)是我纠正一个字节数组总是可以用两种方式来解释:A:作为有符号数B:作为一个无符号数

更重要的是正确的是所有数字(由于存储在计算机中)基本上是一系列字节,这是一个字节数组。说一个字节数组总是可以解释为特定数字类型的有符号或无符号版本是不正确的,因为并非所有数字类型都有签名和未签名版本。浮点类型通常只有签名版本(没有udoubleufloat),并且在此特定情况下,没有无符号版本的BigInteger。换句话说,不,这是不可能的,但由于BigInteger可以表示一个任意大的整数值,所以你不会因为被签名而失去任何范围。

至于你的第二个问题,你将需要追加0x00结束端阵列的,为BigInteger constructor解析在little-endian字节顺序值。如果你调用构造函数之前追加一个00字节到数组结束

5

检查the documentation for the relevant BigInteger constructor,我们看到:

该值中的每个字节 阵列应该在小尾数 顺序,从最低位字节 最高字节

[...]

The constru ctor预计字节数组中的值为 ,使用 符号和幅度表示,而 负值使用两个的 补码表示。 在其他 单词中,如果 最高位字节的值的最高位被设置,则产生的BigInteger值为 ,负值为。根据字节数组的来源 ,这可能会导致 正值被误解为 为负值。

[...]

以防止 误解为负值 正值,则可以 一个零字节的值添加到端阵列的

4

正如其他答案指出的那样,您应该在数组的末尾添加一个00字节以确保生成的BigInteger为正数。

按照the BigInteger Structure (System.Numerics) MSDN Documentation

为了防止的BigInteger(字节[])构造从与正的值的符号和幅度表示,正值混淆负值的二的补码表示,其中的字节数组中的最后一个字节的最显著位通常会设置应该包括一个额外的字节,其值为0

这里的代码来做到这一点:

byte[] byteArray; 
// ... 
var bigInteger = new BigInteger(byteArray.Concat(new byte[] { 0 }).ToArray());