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

发布于 2025-01-12 02:55:20 字数 418 浏览 0 评论 0原文

为什么将字节数组转换为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 也是如此。有谁知道为什么另一个具有相似项目的输出数组被单独转换?

Why convert a byte array to BigInteger, If all members submit 0 or 255 the result is a single-item array instead of a multi-item array? for example:

        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));

This code return only one zero instead of an array of four zeros. The same is true for the 255. Does anyone know why while another output array with similar items are converted separately?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黒涩兲箜 2025-01-19 02:55:20

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

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

BigIngteger doesn't waste space on redundant leading values. If all the individual byte values are zero, that makes the entire number zero which can be represented as a single byte with value zero. So 0000 is the same value as 0.

If all values are 255, that represents 0xFFFFFFFF or -1 since it's a signed integer. And since -1 can be represented as 0xFF, 0xFFFF, 0xFFFFFF etc., there's no point in keeping those redundant leading bytes.

孤城病女 2025-01-19 02:55:20

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

这是在 ToByteArray 文档中指定的

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

...

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

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

BigInteger uses a variable length encoding to represent a number. It has to, since it needs to represent arbitrary large integers.

This is specified in the documentation to ToByteArray

Returns the value of this BigInteger as a byte array using the fewest number of bytes possible. If the value is zero, returns an array of one byte whose element is 0x00.

...

Negative values are written to the array using two's complement representation in the most compact form possible. For example, -1 is represented as a single byte whose value is 0xFF instead of as an array with multiple elements, such as 0xFF, 0xFF or 0xFF, 0xFF, 0xFF, 0xFF.

See also Variable Length Quantity/LEB128 for other kinds of variable length encodings used in some protocols.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文