【问题标题】:c# convert byte array of ascii values to integer arrayc#将ascii值的字节数组转换为整数数组
【发布时间】:2017-06-27 08:19:06
【问题描述】:

我有一个 byte 数组,由 50 字节组成,将 5 整数表示为 ascii 字符值。每个整数值都表示为10 字节:

byte[] receiveBytes = new byte[] {
  20, 20, 20, 20, 20, 20, 20, 20, 20, 49,  // 9 spaces then '1'
  20, 20, 20, 20, 20, 20, 20, 20, 20, 50,  // 9 spaces then '2'
  20, 20, 20, 20, 20, 20, 49, 50, 51, 52,  // 6 spaces then '1' '2' '3' '4'
  20, 20, 20, 20, 20, 20, 53, 56, 48, 49,  // 6 spaces then '5' '8' '0' '1'
  20, 20, 20, 20, 20, 20, 20, 57, 57, 57}; // 7 spaces then '9' '9' '9'

请注意,20space 的 ascii 代码,[48..57]0..9 数字的 ascii 代码。

如何将字节数组转换为整数数组 (int[] intvalues == [1, 2, 1234, 5801, 999])?

我首先尝试将字节数组转换为字符串,然后将字符串转换为整数,如下所示:

string[] asciival = new string[10];
int[] intvalues = new int[5];

Byte[] receiveBytes = '20202020202020202049  //int value = 1
                       20202020202020202050  //int value = 2
                       20202020202049505152  //int value = 1234
                       20202020202053564849  //int value =5801
                       20202020202020575757';//int value = 999

asciival[0] = Encoding.ASCII.GetString(receiveBytes, 0, 10);
asciival[1] = Encoding.ASCII.GetString(receiveBytes, 10, 10);

intvalues[0] = int.Parse(asciival[0]);
intvalues[1] = int.Parse(asciival[1]);

但是没有更简单的方法可以将字节数组复制到字符串数组中吗?

【问题讨论】:

标签: c#


【解决方案1】:

for循环可以简化书写:

byte[] recv = new byte[]{ /* ... */ }

int[] intvalues = new int[recv.Length / 10];

for(int pos = 0; pos < recv.Length; pos += 10)
    intvalues[pos / 10] = int.Parse(Encoding.ASCII.GetString(recv, pos, pos + 10));

【讨论】:

    【解决方案2】:

    我建议使用 Linq

    • 在 10 项(即 10-byte)块上拆分初始数组
    • 过滤每个块中的数字 ('0'..'9')
    • Aggergate 数字转换为单个整数

    实施:

      using System.Linq;
      ...
    
      Byte[] receiveBytes = new byte[] {
        20, 20, 20, 20, 20, 20, 20, 20, 20, 49,  // 9 spaces then '1'
        20, 20, 20, 20, 20, 20, 20, 20, 20, 50,  // 9 spaces then '2'
        20, 20, 20, 20, 20, 20, 49, 50, 51, 52,  // 6 spaces then '1' '2' '3' '4'
        20, 20, 20, 20, 20, 20, 53, 56, 48, 49,  // 6 spaces then '5' '8' '0' '1'
        20, 20, 20, 20, 20, 20, 20, 57, 57, 57}; // 7 spaces then '9' '9' '9'
    
      int[] intvalues = Enumerable.Range(0, receiveBytes.Length / 10)
        .Select(index => receiveBytes
           .Skip(index * 10) // Skip + Take: splitting on 10-items chunks
           .Take(10)                  
           .Where(b => b >= '0' && b <= '9') // just digits 
           .Aggregate(0, (s, a) => s * 10 + a - '0')) 
        .ToArray();
    

    测试

      Console.Write(string.Join(", ", intvalues));
    

    结果:

      1, 2, 1234, 5801, 999
    

    请注意,10 数字可能会溢出 int,因为最大 int 值 (int.MaxValue) 仅为 2147483647。要将初始的 byte[] 表示为 string,您可以再次使用 Linq

      var result = Enumerable
        .Range(0, receiveBytes.Length / 10)
        .Select(index => receiveBytes
           .Skip(index * 10) // Skip + Take: splitting on 10-items chunks
           .Take(10)
           .Select(b => b.ToString("00"))) // enforce leading "0" if necessary
        .Select(items => string.Concat(items));
    
      string text = string.Join(Environment.NewLine, result);
    
      Console.Write(text);
    

    结果

    20202020202020202049
    20202020202020202050
    20202020202049505152
    20202020202053564849
    20202020202020575757
    

    【讨论】:

    • 老实说,我发现 OP 的初始代码(Encoding.ASCII.GetString 后跟 int.Parse)更易于阅读和理解。
    • @stakx:这取决于初始receiveBytes数组中可以出现哪些字节;如果只有数字和空格,我同意。比如说,如果它可以有160(不间断空格)、95(underscope)、0'\0')等作为占位符,那么我宁愿坚持使用Where + Aggregate
    【解决方案3】:

    你可以试试这个:-

    using System;
    using System.Text; 
    class Example
    { 
      public static void Main()
      { 
      // Define a string. 
      String original = "ASCII Encoding"; 
     // Instantiate an ASCII encoding object.
       ASCIIEncoding ascii = new ASCIIEncoding(); 
    // Create an ASCII byte array.
      Byte[] bytes = ascii.GetBytes(original); 
    // Display encoded bytes.
      Console.Write("Encoded bytes (in hex): ");
      foreach (var value in bytes)
        Console.Write("{0:X2} ", value);
        Console.WriteLine(); // Decode the bytes and display the resulting Unicode string. 
        String decoded = ascii.GetString(bytes);
        Console.WriteLine("Decoded string: '{0}'", decoded);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 2020-05-22
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2016-03-02
      • 2014-03-31
      • 2011-09-26
      相关资源
      最近更新 更多