使用C#,将包含二进制数据的字符串转换为字节数组的最有效方法是什么

时间:2008-09-16 13:30:40

标签: c# bytearray

虽然有100种方法可以解决转换问题,但我关注的是性能。

说明字符串只包含二进制数据,就性能而言,在C#下将数据转换为byte [](而不是char [])的最快方法是什么?

澄清:这不是ASCII数据,而是碰巧在字符串中的二进制数据。

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:3)

我不确定ASCIIEncoding.GetBytes是否会这样做,因为它只支持range 0x0000 to 0x007F

你告诉字符串只包含字节。但是.NET字符串是一个字符数组,1个字符是2个字节(因为.NET将字符串存储为UTF16)。因此,您可以有两种情况来存储字节0x42和0x98:

  1. 该字符串是ANSI字符串并包含字节并转换为unicode字符串,因此字节将为0x00 0x42 0x00 0x98。 (字符串存储为0x0042和0x0098)
  2. 该字符串只是一个字节数组,您将其类型化或刚收到一个字符串,因此成为以下字节0x42 0x98。 (字符串存储为0x9842)
  3. 在第一种情况下,结果将是0x42和0x3F(ascii为“B?”)。第二种情况会导致0x3F(ascii表示“?”)。这是合乎逻辑的,因为字符在有效的ascii范围之外,并且编码器不知道如何处理这些值。

    所以我想知道为什么它是带字节的字符串?

    • 也许它包含一个编码为字符串的字节(例如Base64)?
    • 也许你应该从char数组或字节数组开始?

    如果您确实遇到情况2并且想要从中获取字节,则应使用UnicodeEncoding.GetBytes调用。因为那将返回0x42和0x98。

    如果您想从char数组转换为字节数组,最快的方法就是Marshaling ..但这不是很好,并且使用双内存。

    public Byte[] ConvertToBytes(Char[] source)
    {
        Byte[] result = new Byte[source.Length * sizeof(Char)];
        IntPtr tempBuffer = Marshal.AllocHGlobal(result.Length);
        try
        {
            Marshal.Copy(source, 0, tempBuffer, source.Length);
            Marshal.Copy(tempBuffer, result, 0, result.Length);
        }
        finally
        {
            Marshal.FreeHGlobal(tempBuffer);
        }
        return result;
    }
    

答案 2 :(得分:0)

在C#中有没有这样的东西作为ASCII字符串!字符串总是包含UTF-16。没有意识到这会导致很多问题。也就是说,之前提到的方法是因为它们将字符串视为UTF-16编码并将字符转换为ASCII符号。

/ EDIT回应澄清:二进制数据是如何进入字符串的?字符串不应包含二进制数据(使用byte[])。

答案 3 :(得分:0)

如果您想从字符串转换为二进制数据,您必须知道使用什么编码将二进制数据转换为字符串。否则,您可能无法获得正确的二进制数据。因此,最有效的方法可能是编码子类上的GetBytes()(例如UTF8Encoding),但您必须确定哪种编码。

Kent Boogaart对原始问题的评论总结得很好。 ]