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

问题描述 投票:3回答:4

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

鉴于字符串仅包含二进制数据,在性能方面,用C#将数据转换为字节[](不是char [])的最快方法是什么?

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

c# bytearray
4个回答
3
投票

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

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

  1. 该字符串是一个ANSI字符串,包含字节,并转换为unicode字符串,因此字节将为0x00 0x42 0x00 0x98。 (字符串存储为0x0042和0x0098)
  2. 该字符串只是一个字节数组,您已将该字符串键入或接收为一个字符串,因此成为随后的字节0x42 0x98。 (该字符串存储为0x9842)

在第一种情况下,结果将是0x42和0x3F(“ B?”的ASCII码)。第二种情况将导致0x3F(“?”的ascii)。这是合乎逻辑的,因为char超出有效的ascii范围,并且编码器不知道如何处理这些值。

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

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

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

如果要从char数组转换为byte数组,最快的方法是封送处理。但这不是很好,它使用双内存。

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


0
投票

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

/编辑以澄清:二进制数据如何进入字符串?字符串不应该包含二进制数据(为此使用byte[])。


0
投票

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

[Kent Boogaart对原始问题的评论很好地总结了一下。 ;]

© www.soinside.com 2019 - 2024. All rights reserved.