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

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

Using C#, what is the most efficient method of converting a string containing binary data to an array of bytes

虽然有100种方法可以解决转换问题,但我将重点放在性能上。

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

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


UTF8Encoding.GetBytes


我不确定ASCIIEncoding.GetBytes是否会这样做,因为它仅支持范围0x0000到0x007F。

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

  • 该字符串是一个ANSI字符串,包含字节,并被转换为unicode字符串,因此字节将为0x00 0x42 0x00 0x98。 (该字符串存储为0x0042和0x0098)
  • 该字符串只是一个字节数组,您将其转换为字符串或仅接收到一个字符串,因此成为随后的字节0x42 0x98。 (该字符串存储为0x9842)
  • 在第一种情况下,结果将是0x42和0x3F(" B?"的ASCII码)。第二种情况将导致0x3F("?"的ascii)。这是合乎逻辑的,因为char超出有效的ascii范围,并且编码器不知道如何处理这些值。

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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;
    }

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

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


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

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


    推荐阅读

      字符串查找命令linux?

      字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

      linux恢复数据库命令?

      linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文

      linux储存命令数据?

      linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

      linux储存命令数据?

      linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

      linux命令替换字符串?

      linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

      linux命令大全数据库?

      linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

      linux上数据库的命令?

      linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

      linux命令dm数据库?

      linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

      linux拼接字符串命令?

      linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,l

      linux使用命令的方法?

      linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

      linux存储数据命令?

      linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Lin

      linux数据库查找命令?

      linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

      添加字符串命令linux?

      添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,L

      linux数据库同步命令?

      linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

      linux二进制执行命令?

      linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

      linux建立数据库命令?

      linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

      linux命令进数据库?

      linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

      linux清空表数据命令?

      linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,L

      linux拷贝数据命令?

      linux拷贝数据命令?,系统,地址,文件,数据,命令,目录,服务,基本知识,项目,密

      linux命令查找字符串?

      linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文