使用,什么是最有效的方法转换成一个包含二进制数据的一个阵字节

StackOverflow https://stackoverflow.com/questions/72176

  •  09-06-2019
  •  | 
  •  

虽然有100个方法解决转换问题,我注重性能。

把那串仅包含二进制数据,什么是最快的方法,在性能方面的转换的数据字节[](未char[])根据C#?

澄清:这不是ASCII数据,而不是二进制数据出现这种情况是在一串。

有帮助吗?

解决方案

我不确定用ASCIIEncoding.GetBytes是要做到这一点,因为它只支持 范围0x0000到0x007F.

你告诉串仅包含字节。但一个.净串是一系列文字和1char是字节2(因为一个.净储存串为UTF16).所以你可以有两种情况用于储存字节0x42和0x98:

  1. 串是一个ANSI串并字节所载并转化为一个unicode串,这样的字节将0x00 0x42 0x00 0x98.(String被储存作为0x0042和0x0098)
  2. 串的只是字节列其typecasted或刚刚收到一串并因此成了以下字节0x42 0x98.(String被储存作为0x9842)

在第一种情况的结果将是0x42和0x3F(ascii为"B?").第二种情况会导致在0x3F(ascii于"?").这是合乎逻辑的,因为该字之外的有效ascii范围和编码不知道该怎么做这些价值观。

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

  • 也许它包含一个字节的编码作为一个string(例如 Base64)?
  • 也许你应该开始一个char列或一个字节阵?

如果你真的做了情况,2并且你想要得到的字节的应用 UnicodeEncoding.GetBytes 呼叫。因为那将返回0x42和0x98.

如果你想去从char阵字阵列的最快方式,将编..但是,这不非常好,并且使用双存储器。

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

其他提示

那里是 没有这样的事情 作为ASCII string在C#!字符串 总是 包含UTF-16.不实现这导致了很多的问题。这就是说,所提到的方法之前的工作,因为他们认为串为UTF-16编码并改变人物为ASCII码元。

/编辑响应澄清:如何做二进制数据取得的串?串不应该包含二进制数据(用 byte[] 对于那)。

如果你想要从一串的二进制数据, 你必须知道什么样的编码是用于转换的二进制数据来一串的第一个地方.否则,可能会不正确的二进制数据。因此,最有效的方式是有可能的GetBytes()关于一个编码小类(例如UTF8Encoding),但你必须知道哪些编码。

在评论由肯特Boogaart在原来的问题总结非常好。;]

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top