C# 字节 [,] 到字符串数组

本文关键字:字符串 数组 字节 | 更新日期: 2023-09-27 18:30:15

>上下文

  • 我寻找一种简单的方法来将 2D 字节 [,] 数组隐藏为 C# 中的字符串数组。

  • 我发现该函数System.Text.Encoding.UTF8.GetString()将 byte[] 转换为字符串。

问题

  • 但是 2D 字节 [,] 数组到字符串数组该怎么办。字节 [,] 的长度每次都不同。

C# 字节 [,] 到字符串数组

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

在此处在线测试。但是,如果类型是byte[][]而不是byte[,],事情对你来说就容易多了......你能澄清一下你为什么使用byte[,]吗?


说明:GetLength(int dimension) 返回指定维度的长度 - 在本例中,GetLength(0) 2(对于两个字符串),GetLength(1) 6(对于字符串长度为 6)。我们分配一个足够大的字符串数组来容纳我们所有的字符串。然后,对于每个字符串(在 for 循环中),我们首先获取属于该字符串的所有字节。这是使用 Linq 完成的:我们将 byte[,] 数组转换为一系列普通byte s(使用 OfType ),然后我们Skip我们以前见过的所有字节,只Take我们需要的任意数量的byte s。然后这些byte被填充到临时数组stringBytes中,然后被解码成一个字符串。

交错数组要容易得多,因为您可以遍历包含数组的数组。对于他们,你可以做这样的事情:

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