如何适当地从字符串中获取字节?

7

我有一个字符串变量,通过以下循环得到以下字节:

Bytes I get: 1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

With that loop:

  byte[] temp = new byte[source.Length];
  string x = "";
  for (int i = 0;i != source.Length;i++)
  {
    temp[i] = ((byte) source[i]);
  }

现在我想简化这个操作并使用Encoding的GetBytes方法。问题是我无法确定适当的编码方式。例如,我得到了几个错误的字节:

Encoding.ASCII.GetBytes(source):    1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f
Encoding.Default.GetBytes(source):  1e 05 55 3c  e2  3f 6f 03  3f 1a 1d  f4 51 6a 5e 3a  ce  4e 04  3f

我该如何摆脱循环并使用编码的GetBytes方法?
以下是摘要:
Loop(correct bytes):                1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

Encoding.ASCII.GetBytes(source):    1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f
Encoding.Default.GetBytes(source):  1e 05 55 3c  e2  3f 6f 03  3f 1a 1d  f4 51 6a 5e 3a  ce  4e 04  3f

谢谢!

补充:

我有一个十六进制的字符串输入,例如:"B1807869C20CC1788018690341", 然后我用以下方法将其转换为字符串:

private static string hexToString(string sText)
{
  int i = 0;
  string plain = "";
  while (i < sText.Length)
  {
    plain += Convert.ToChar(Convert.ToInt32(sText.Substring(i, 2), 16));
    i += 2;
  }
  return plain;
}

1
你如何从字节中获取字符串 source - Mehrdad Afshari
2
你能提供相关的字符串吗? - yas4891
1
@John,说真的:你想要实现什么? - yas4891
@yas4891 好的,我注意到我正在将十六进制字符串转换为字符串,然后再转换为字节数组。我可以直接从十六进制字符串转换为byte[],这样可以正常工作。但只是出于好奇,如何正确地进行转换:hexString -> 字符串 -> 字节数组? - John
@John,没有一种单一的“正确”的hexString -> to string -> to byte array方法;要从 string 转换为字节数组,您需要真正了解它使用的是哪种编码方式;如果它只是任意的二进制数据,则它不是一个字符串,并且不应该被视为字符串。除非您采用28591(如我的答案)。 - Marc Gravell
2个回答

4
你的hexToString函数通过十六进制将字节值直接转换为Unicode编码点,范围在0-255之间。恰巧,这与代码页28591相关联,因此如果你使用:
Encoding enc = Encoding.GetEncoding(28591);

使用enc,您应该能够得到正确的数据;然而,更重要的一点是,二进制数据不同于文本数据,您不应使用string来存储任意二进制数据。


可以工作了。你从哪里知道它是28591的? - John
@John 为了回答这个问题,我写了一个控制台 exe,通过 Encoding.GetEncodings() 迭代了所有编码,并测试了它们 ;p http://pastie.org/2948555 - Marc Gravell
@John 但是再说一遍:如果数据实际上不是真正的文本数据,你就不应该尝试将其保存在一个string中。 - Marc Gravell

3

假设您正在尝试“解码”字符串文字:
C#在内部将字符串存储为Unicode。因此,您可能需要使用正确支持Unicode的编码。

例如:

Encoding.UTF8.GetBytes(source)
Encoding.UnicodeEncoding.GetBytes(source)

请注意MSDN中对Encoding.Default的警告。


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