如何从文件中读取/写入 C# BigIntegers?

Cha*_*les 4 c# serialization biginteger

在我的一个课程中,我有一个例程来读取和写入 Decimal 类型的数组(使用BinaryReader/BinaryWriter和方法,即:ReadDecimal()Write()

BinaryReader inputReader = new BinaryReader(File.OpenRead(BaseFilePath));
for (int x = 0; x < 6; x++) {
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
        for (int z = 0; z < m_Codes[x].GetLength(1); z++) {
            m_Codes[x][y, z] = inputReader.ReadDecimal();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

for (int x = 0; x < 6; x++) {
    for (int y = 0; y < m_Codes[x].GetLength(0); y++) {
        for (int z = 0; z < m_Codes[x].GetLength(1); z++) {
            outputWriter.Write(m_Codes[x][y, z]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

..如您所见,只有第一个维度在设计时已知,其他维度在运行时有所不同。

在完美的世界中,我会替换ReadDecimal()ReadBigInteger()和 类似的写入方法,但这似乎在 Stream 类中不受支持;我猜这是因为 BigInteger 可以是任意长度。

我能想到的最好的事情是“手动编码”BigInteger,将其转换为数组byte[],然后写入该数组的长度,然后将每个字节写入数组本身(并执行相反的操作以将其读入)

两个问题:

1)这是更好的方法吗?

2) 我的主要动机是提高绩效;BigInteger 的性能甚至比 Decimal 好得多,如果有的话?

Jon*_*eet 5

有一种相当简单的方法:调用BigDecimal.ToByteArray序列化,以及BigDecimal(byte[])反序列化时的构造函数。诚然,这最终会复制数据,但我仍然希望它相当快。

您更关心什么:序列化性能还是算术性能?

至于BigInteger和 之间的任何速度差异decimal- 您应该针对您实际想要执行的操作对其进行测试,并意识到它们的行为会有所不同(例如,将 3 除以 2 显然会为每种类型给出不同的答案)。