我有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'
请注意,20
是space
的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]);
但是没有更简单的方法将字节数组复制到字符串数组中吗?
答案 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 :
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);
}
}