c#将ascii值的字节数组转换为整数数组

时间:2017-02-09 10:52:25

标签: c#

我有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]);

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

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

我建议使用 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)为{{1} } 只要。要将初始2147483647表示为byte[],您可以再次使用 Linq

string

结果

  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);

答案 2 :(得分:-1)

你可以试试这个: -

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);
  }
}