为什么BigInteger.ToByteArray返回单项数组而不是多项数组



为什么要将字节数组转换为BigInteger,如果所有成员都提交0或255,则结果是单项数组而不是多项数组?例如:

byte[] byteArray = { 0, 0, 0, 0 };
BigInteger newBigInt = new BigInteger(byteArray);
MessageBox.Show(newBigInt.ToString());
byte[] bytes;
bytes = newBigInt.ToByteArray();
MessageBox.Show(string.Join(", ", bytes));

此代码只返回一个零,而不是四个零的数组。255也是如此。有人知道为什么另一个具有相似项的输出数组要单独转换吗?

BigIngteger不会在冗余前导值上浪费空间。如果所有单独的字节值都为零,则整个数字为零,可以表示为值为零的单个字节。因此0000与0的值相同。

如果所有值都是255,则表示0xFFFFFFFF或-1,因为它是一个有符号整数。由于-1可以表示为0xFF0xFFFF0xFFFFFF等,因此保留这些冗余的前导字节是没有意义的。

BigInteger使用可变长度编码来表示数字。它必须这样做,因为它需要表示任意的大整数。

这在ToByteArray的文档中有规定

以字节数组的形式返回此BigInteger的值,使用尽可能少的字节数。如果值为零,则返回一个元素为0x00的一个字节的数组。

。。。

负值以最紧凑的形式使用二的补码表示写入数组。例如,-1表示为值为0xFF的单个字节,而不是具有多个元素的数组,例如0xFF、0xFF或0xFF、0xFF、0xFF、0xFF。

有关某些协议中使用的其他类型的可变长度编码,请参阅可变长度数量/LEB128。

最新更新