将字符串转换为原始字节数组

4

我有一个包含二进制数据(非文本数据)的字符串。

如何将其转换为原始字节数组?


请问您从哪里获取了这样的字符串? - Pavel Radzivilovsky
1
你的字符串是否是Base64编码的? - Ray
非文本二进制!=字符串:http://marcgravell.blogspot.com/2010/03/binary-data-and-strings.html - Marc Gravell
4个回答

8

C#中的字符串 - 根据定义 - 不包含二进制数据。它由一系列Unicode字符组成。


如果您的字符串仅包含ASCII(7位)字符集中的Unicode字符,则可以使用Encoding.ASCII将字符串转换为字节:

byte[] result = Encoding.ASCII.GetBytes(input);

如果您有一个包含Unicode字符范围在u0000-u00ff之间的字符串,并希望将其解释为字节,则可以将字符转换为字节:

byte[] result = new byte[input.Length];
for (int i = 0; i < input.Length; i++)
{
    result[i] = (byte)input[i];
}

好的。所以我应该一开始就有一个字符串。谢谢。 - Joel

5
在字符串中存储二进制数据是一个非常糟糕的主意。然而,如果你必须这样做,可以使用1252代码页将二进制字符串转换为字节数组。不要使用代码页0,否则在其他语言中可能会丢失一些值。恰好1252代码页可以将0到255的所有字节值正确地转换为Unicode并再次转换回来。
有一些VB6程序编写得很差,使用二进制字符串。不幸的是,有些程序行数太多,几乎不可能一次性全部转换为byte()数组。
你已经被警告了。使用时自行承担风险。
Dim bData() As Byte
Dim sData As String

'convert string binary to byte array
bData = System.Text.Encoding.GetEncoding(1252).GetBytes(sData)

'convert byte array to string binary
sData = System.Text.Encoding.GetEncoding(1252).GetString(bData)

你不能使用CP1252编码来表示'\x80'字符,它会被转换成'?'。 - Abyx
字节x80转换为Unicode值x20ac,然后再转回来。你是怎么得到一个问号的? - Brain2000
也许这取决于系统。我使用了 BitConverter.ToString(Encoding.GetEncoding(1252).GetBytes("\x80")) 并得到了 3F。你可以在 ideone.com 上尝试一下。 - Abyx
BitConverter.ToString() 实际上不是代码页 1252。它将字符串“80”作为两个单独的字符“8”和“0”返回给我。 我指的是将实际二进制数据存储在字符串类型中。例如,以下代码将把 byte 类型的 x80 转换成字符串,然后再转回 byte:MessageBox.Show(Encoding.GetEncoding(1252).GetByte(Encoding.GetEncoding(1252).GetString(128))))。 - Brain2000
那一行有错误,我无法编辑我的评论。应该这样写:MessageBox.Show(Encoding.GetEncoding(1252).GetBytes(Encoding.GetEncoding(1252).GetString(New Byte() {128}))(0)) - Brain2000
这可能会使事情更清晰。日本的Codepage 932并没有将所有256个字符映射到Unicode和回来。一些大于128的字节值会丢失,因此您不能使用使用codepage 932转换的字符串来传递二进制数据。此示例将字节x130转换为字符串,然后再转换回来。您会注意到返回值是x129,而不是x130。MessageBox.Show(Encoding.GetEncoding(932).GetBytes(Encoding.GetEncoding(932).GetString(New Byte() {130}))(0)) - Brain2000

1

这里有一种方法:

public static byte[] StrToByteArray(string str)
{
  System.Text.ASCIIEncoding  encoding=new System.Text.ASCIIEncoding();
  return encoding.GetBytes(str);
}

ASCII 编码会不会破坏我的数据? - Joel
@Joel:如果您的输入仅包含范围在u0000-u007f之间的字符,则ASCIIEncoding可以正常工作。如果输入字符串包含任何其他字符,它将抛出异常。 - dtb

0
System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
byte[] theBytes = encoding.GetBytes("Some String");

请注意,您可能想要使用其他编码格式。

无法工作。源代码的内容假定为UTF-16,这将在某些字节值组合上失败。 - Pavel Radzivilovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接