加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:00:25 所属栏目:百科 来源:网络整理
导读:标题不言而喻.我有一个文件,包含一个base64编码的byte [],可变宽度整数,最小8位,最大32位 我有一个大文件(48MB),我试图找到从流中抓取整数的最快方法. 这是perf应用程序中最快的代码: static int[] Base64ToIntArray3(string base64,int size){ Listint res
标题不言而喻.我有一个文件,包含一个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,size);
            res.Add(BitConverter.ToInt32(buffer,0));
        }
    }

    return res.ToArray();
}

我看不到更快的方法将字节填充到32位.任何想法,破坏和chapettes?解决方案应该在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;
}

注意:未经测试的代码!你必须验证它实际上做了它应该做的事情,但至少它显示了原理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读