我有一个由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]);
但是,难道没有更简单的方法将字节数组复制到字符串数组中吗?
发布于 2017-02-09 11:03:01
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));
发布于 2017-02-09 11:20:10
我建议使用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
)仅为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
发布于 2017-02-09 11:02:53
你可以试试这个:-
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);
}
}
https://stackoverflow.com/questions/42134733
复制相似问题