zoukankan      html  css  js  c++  java
  • C#字节数组的常用解码处理方法

    在某些情况下,比如说串口通信或者读取二进制的文件,通常会得到一个byte数组形式的数据。

    然而对于这个数据处理常常令人苦恼,因为通常通信情况下,并不是一个字节代表一个字符或者某个数据,而是数据夹杂在字节与字节之间。

    读取文件得到的情况:

    FileInfo fi = new FileInfo(@"E:ABC.DAT");
    long len = fi.Length;
    FileStream fs = new FileStream(@"E:ABC.DAT", FileMode.Open);
    byte[] buffer = new byte[len];
    fs.Read(buffer, 0, (int)len);
    fs.Close();

    1:将一个字节转换为16进制的字符表示

    String str= Convert.ToString(buffer[i], 16);   //16进制
    String PrintStr = (Convert.ToString(buffer[i2], 16)).PadLeft(2, '0') + " ";   //转换为2个字符长度的(不足左侧补零)

    2:ASCII编码存储的转换(字节数组buffer的4到17为一个ASCII字符存储的时间)

    string str_stime = Encoding.ASCII.GetString(buffer,  4, 17);  
    DateTime stime = new DateTime(Int32.Parse(str_stime.Substring(0, 4)),
                                Int32.Parse(str_stime.Substring(4, 2)),
                                Int32.Parse(str_stime.Substring(6, 2)),
                                Int32.Parse(str_stime.Substring(8, 2)),
                                Int32.Parse(str_stime.Substring(10, 2)),
                                Int32.Parse(str_stime.Substring(12, 2)),
                                Int32.Parse(str_stime.Substring(14, 3)));    

    3:如果某个数据存储在字节之间

         如2个字节      0000|0000||0000|0000    

                                字节0           字节1

         这两个字节的前5个bit表示一个数据,再6个bit表示一个数据,后5个bit又表示一个数据

      由于在C#中int为32位数据,可以存储4个字节的数据,int16可以表示2个字节,然后通过移位和位运算来处理。

      

    int16 iData = buffer[1] + (buffer[0] << 8)
    iData1 = iDate & 0x1F;
    iData2 = (iDate >> 5) & 0x3F;
    iData2 = (iDate >> 11) & 0x1F;

    如有错误,敬请指教。

  • 相关阅读:
    模拟——1031D
    线性dp——cf1032
    莫比乌斯反演——专题练习
    数论,质因数,gcd——cf1033D 好题!
    连通图,set——cf1037E
    线段树动态开点——cf1045G
    跳表上线性dp——1150D 好题!
    高斯消元求主元——模意义下的消元cf1155E
    汽车长期停放,毁车没商量?
    驾校都是错的?这才是日常驾驶正确的换挡方式
  • 原文地址:https://www.cnblogs.com/visionfeng/p/5622239.html
Copyright © 2011-2022 走看看