【问题标题】:How to fast convert a string array to a byte array?如何快速将字符串数组转换为字节数组?
【发布时间】:2021-08-23 06:57:46
【问题描述】:

我需要将字符串数组转换为字节数组。我知道这个问题已经发布并回答了很多次,但由于某种原因,没有一个解决方案适合我。

这是最常见的解决方案:

public static byte[] StringArrayToByteArray(string[] someStringArray)
{
    return someStringArray.Select(s => Convert.ToByte(s, 16)).ToArray();
}

但是,当我运行它时,我收到以下错误:FormatException: Could not find any parsable digits.FormatException: Additional unparsable characters are at the end of the string.

我需要为我的数据保存字母和分隔符 (/)。这是我的代码:

        string[] stringArray = new string[map.Size.x * map.Size.y];
        int counter = 0;
        for (int y = (int) map.Rect.y; y < map.Rect.yMax; y++)
        {
            for (int x = (int) map.Rect.x; x < map.Rect.xMax; x++)
            {
                stringArray[counter] = map[x,y].Name;
                stringArray[counter] += "/";
                counter++;
            }
        }

那我需要把这个string[]转换成字节数组。

【问题讨论】:

标签: c# arrays string type-conversion byte


【解决方案1】:

您可以将这些字符串组合成一个字符串并返回其字节[]。即:

public static byte[] StringArrayToByteArray(string[] someStringArray)
{
    return string.Join("",someStringArray).Select(x => (byte)x).ToArray();
}

【讨论】:

  • 简单,运行速度惊人。谢谢!
  • @OlivierRogier 谢谢你的建议。没想到先加入整个数组再进行转换。
【解决方案2】:

最快的方法(性能方面)是使用Encoding.GetBytes 的重载之一,它允许提供byte[] 缓冲区。

这仅适用于固定宽度的编码,UnicodeASCII。目前尚不清楚您想要哪种编码。你得到这个错误的原因是因为字符不适合byte,所以我选择了Unicode

public static byte[] StringArrayToByteArray(string[] someStringArray)
{
    var buffer = new byte[someStringArray.Sum(s => s.Length) * 2];   // remove * 2 for ASCII
    var position = 0;
    foreach (var s in someStringArray)
        position += Encoding.Unicode.GetBytes(s, o, s.Length, buffer, position);

    return buffer;
}

您还可以在较新版本的 .NET 中使用新的 Span&lt;byte&gt; 重载

【讨论】:

    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多