gpt4 book ai didi

c# - 从 byte[] 中提取可变宽度有符号整数的最快方法

转载 作者:行者123 更新时间:2023-11-30 12:46:11 25 4
gpt4 key购买 nike

标题不言自明。我有一个包含可变宽度整数的 base64 编码 byte[] 的文件,最小 8 位,最大 32 位

我有一个大文件 (48MB),我正在尝试找到从流中获取整数的最快方法。

这是 perf 应用程序中最快的代码:

static int[] Base64ToIntArray3(string base64, int size)
{
List<int> res = new List<int>();
byte[] buffer = new byte[4];

using (var ms = new System.IO.MemoryStream(Convert.FromBase64String(base64)))
{
while(ms.Position < ms.Length)
{
ms.Read(buffer, 0, size);
res.Add(BitConverter.ToInt32(buffer, 0));
}
}

return res.ToArray();
}

我看不到将字节填充到 32 位的更快方法。有什么想法吗?解决方案应该在 c# 中。如果必须,我可能会转向 C/++,但我不想这样做。

最佳答案

没有理由使用内存流将字节从一个数组移动到另一个数组,直接从数组中读取即可。另外,数组的大小是已知的,因此需要将项目添加到列表中,然后将其转换为数组,您可以从一开始就使用数组:

static int[] Base64ToIntArray3(string base64, int size) {
byte[] data = Convert.FromBase64String(base64);
int cnt = data.Length / size;
int[] res = new int[cnt];
for (int i = 0; i < cnt; i++) {
switch (size) {
case 1: res[i] = data[i]; break;
case 2: res[i] = BitConverter.ToInt16(data, i * 2); break;
case 3: res[i] = data[i * 3] + data[i * 3 + 1] * 256 + data[i * 3 + 2] * 65536; break;
case 4: res[i] = BitConverter.ToInt32(data, i * 4); break;
}
}
return res;
}

注意:未经测试的代码!你必须验证它确实做了它应该做的,但至少它说明了原理。

关于c# - 从 byte[] 中提取可变宽度有符号整数的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21090366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com