使用C#采样和转换二进制数据数组的有效方法

问题描述

|| 我有一个字节数组。它包含24位带符号整数,这些整数存储在lsb到msb中。该阵列最多可容纳4mb的数据。整数将转换为32位带符号整数,供应用程序使用。我想听听有关转换和采样此数据的可能策略。 我需要对数据做的一件事就是对它进行图形化处理。通过顺序采样,我担心会丢失数据中的一些重要峰谷。我还想进行一些计算以确定最高和最低值。 鉴于我需要做的事情,是否有任何算法或方法可以帮助我快速有效地实现目标?     

解决方法

        如果您的输入必须为3字节整数,则可以按以下方式转换为4字节整数:
byte[] input = new byte[] {1,2,3,4,5,6,7,8,9}; //sample data
byte[] buffer = new byte[4]; //4 byte buffer for conversion from 3-> 4 byte int
int[] output = new int[input.Length / 3];

for (int i = 0,j = 0; i < input.Length; i += 3,j++)
{
    Buffer.BlockCopy(input,i,buffer,3);

    int signed32 = BitConverter.ToInt32(buffer,0);

    output[j] = signed32;
}
编辑 修复了小字节序的块复制。     ,        我建议您将
byte
数组转换为
int[]
。这样,您可以轻松地使用它,并且当今的计算机可以使用32位整数,这要比必须始终使用表示24位整数的字节更好。     ,        您应该使用常规大小的整数。 存储很便宜(特别是如果您仅需要约4MB的数据),并且如果要将它们转换为int32以进行操作,则最好从一开始就采用这种格式。 如果该转换实际上会产生另一个int32数组,那么您的内存占用就增加了一倍。如果转换单个元素,则只会增加执行时间。 最好使用本地int大小。     ,        如果直接使用字节(一次使用3个字节),可能会更容易实现,并使将来的开发人员了解。
// If you\'re reading from a file,you don\'t have to read the whole array.
// Just read a large chunk (like 3 * 1024) bytes at a time (so it\'s divisible by 3).
byte []  data = new []{1,9};
int []  values = new [data.Length /3];
int min = int.MaxValue;
int max = int.MaxValue;

for (int i = 0,j = 1; i < data.Length - 2; i += 3,j++)
{
   byte b1 = data[i];
   byte b2 = data[i+1];
   byte b3 = data[i+2];
   // Are we dealing with 2\'s compliment or a sign bit?  Let\'s assume sign bit.
   int sign = b3 >> 7 == 1 ? -1 : 1;
   int value = sign * ((int) (b3 <1)>1)<<16 + b2 << 8 + b1;
   values[j] = value;
   max = max > value ? max : value;
   min = min < value ? min : value;
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...