上下文
我寻找一种简单的方法将2D字节[,]数组转换为C#中的字符串数组。
我发现convertig byte []的函数System.Text.Encoding.UTF8.GetString()
为字符串。
问题
答案 0 :(得分:0)
byte[,] bytes = new byte[,] {
{ (byte)'H', (byte)'e', (byte)'l', (byte)'l', (byte)'o', (byte)'!' },
{ (byte)'W', (byte)'o', (byte)'r', (byte)'l', (byte)'d', (byte)0 }
};
string[] strings = new string[bytes.GetLength(0)];
for(var i = 0; i < bytes.GetLength(0); i++) {
byte[] stringBytes = bytes.OfType<byte>()
.Skip(i * bytes.GetLength(1))
.Take(bytes.GetLength(1))
.ToArray();
strings[i] = System.Text.Encoding.UTF8.GetString(stringBytes);
}
Test it online here。但是,如果类型为byte[][]
而不是byte[,]
,那么对您来说事情要容易得多......您能澄清一下您使用byte[,]
的原因吗?
说明:GetLength(int dimension)
返回指定维度的长度 - 在这种情况下,GetLength(0)
为2
(对于两个字符串),GetLength(1)
为6
(字符串长度为6)。我们分配一个足够大的字符串数组来保存所有字符串。然后,对于每个单个字符串(在for
循环中),我们首先获得属于该字符串的所有字节。这是使用Linq完成的:我们将byte[,]
数组转换为一系列普通byte
s(使用OfType
),然后我们Skip
我们看到的所有字节之前且仅Take
我们需要的byte
个byte
。然后将这些stringBytes
填充到临时数组pname
中,然后将其解码为字符串。
答案 1 :(得分:0)
Jagged数组更容易,因为您可以遍历包含数组的数组。对他们来说,你可以做一些像:
var stringArray = byteArrays
.Select(innerArray => Encoding.UTF8.GetString(innerArray))
.ToList();
但由于情况并非如此,我们需要提出不同的东西。多维数组更像是一个excel电子表格,其中每个单元格包含一个字符。
问题在于每行具有完全相同的字节数,而字符串可能具有更小的大小。最标准的方法是使用NULL(0)终止字符串。
这是我的工作样本:
class Program
{
static void Main(string[] args)
{
//different sizes for each row.
byte[,] arrays = new byte[2,40];
arrays[0,0] = (byte)'A';
arrays[0, 1] = (byte)'B';
arrays[0, 2] = (byte)'C';
arrays[0, 3] = (byte)'D';
arrays[1, 0] = (byte)'E';
arrays[1, 1] = (byte)'F';
arrays[1, 2] = (byte)'G';
arrays[1, 3] = (byte)'H';
arrays[1, 4] = (byte)'I';
List<string> stringArray = new List<string>();
List<byte> stringBytes = new List<byte>();
for (int row = 0; row < arrays.GetLength(0); row += 1)
{
for (int col = 0; col < arrays.GetLength(1); col += 1)
{
//got a null terminator
if (arrays[row, col] == 0)
{
//check if it's for UTF8 encoding.
if (arrays.GetLength(1) == col+1 || arrays[row,col+1] == 0)
{
//nope. End of this string.
stringArray.Add(Encoding.UTF8.GetString(stringBytes.ToArray()));
stringBytes.Clear();
break;
}
}
// add all bytes for the current row.
stringBytes.Add(arrays[row, col]);
}
}
foreach (var item in stringArray)
{
//prints:
// ABCD
// EFGHI
Console.WriteLine(item);
}
}
}