c# - 将存储在整数列表(小端)中的二进制表示形式转换为 Biginteger

标签 c# vb.net type-conversion byte biginteger

我有一个整数列表,比如说 L,它包含一个数字的二进制表示。 列表L中的每个整数可以是0或1。“最低有效位”在左边(不是在右边)。

示例:1000001111 代表(十进制)数字 961,或 0111010001 代表 558。

我想将列表转换为 Biginteger。

到目前为止,我已经尝试了以下方法:

Dim bytes(L.Count - 1) As Byte
For i As Integer = 0 to L.Count - 1 
    bytes(i) = CByte(L(i))
Next

Dim Value As New BigInteger(bytes)

Return Value

但结果是完全错误的。任何人都可以帮助进行此转换吗? c# 的 vb.net 示例同样完美。

我还研究了从此处的问题中提取的类似以下内容:

Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);

但 Biginteger 转换仍然没有成功。

最佳答案

这应该有效,使用 BitArray帮助您获取值,以及 this snippet from Jon Skeet将其转换为 byte[]

int[] ints = new[] { 1,0,0,0,0,0,1,1,1,1 };
// 1,0,0,... becomes true,false,false,... with this Select
BitArray bits = new BitArray(ints.Select(x => x > 0).ToArray());

byte[] bytes = new byte[(bits.Length + 7) / 8];
bits.CopyTo(bytes, 0);

BigInteger bigInt = new BigInteger(bytes); // 961

如果性能至关重要,您可以通过使用位移位构建 byte[] 来改进它。但这是相当 (IMO) 简洁、可读且(我期望)快速的代码。

558(0,1,1,1,0,1,0,0,0,1)也可以。

关于c# - 将存储在整数列表(小端)中的二进制表示形式转换为 Biginteger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947412/

相关文章:

c# - Specflow - 作为功能文件/BDD 的一部分涵盖的测试类型是什么

c# - 将视频分享到Facebook墙

asp.net - Visual Studio 2015 中的 "Visual Basic 10.0 does not support readonly auto-implemented properties"错误

vb.net - vb.net datagridview 中的长按事件是什么

go - func() 在自定义结构类型上时的接口(interface)转换

c# - 如何动态地将 JSON 转换为正确的 DTO 类?

wpf - 如何将 byte[] 转换为 BitmapImage?

c# - stub 或模拟 ASP.NET Web API HttpClient

c# - ASP Gridview 下拉列表选择已更改,如何填充 rowDataBound() 以外的下拉列表

vb.net - 将字符串从两个文本框转换为 hh :mm vb. NET