【问题标题】:Whats going on with this byte array?这个字节数组是怎么回事?
【发布时间】:2011-09-26 11:28:23
【问题描述】:

我有一个字节数组: 00 01 00 00 00 12 81 00 00 01 00 C8 00 00 00 00 00 08 5C 9F 4F A5 09 45 D4 CE

通过StreamReader使用UTF8 encoding读取

// Note I can't change this code, to many component dependent on it.
using (StreamReader streamReader = 
    new StreamReader(responseStream, Encoding.UTF8, false))
{
    string streamData = streamReader.ReadToEnd();
    if (requestData.Callback != null)
    {
        requestData.Callback(response, streamData);
    }
}

当该函数运行时,我得到以下返回给我(我转换为字节数组)

00 01 00 00 00 12 EF BF BD 00 00 01 00 EF BF BD 00 00 00 00 00 08 5C EF BF BD 4F EF BF BD 09 45 EF BF BD

不知何故,我需要获取返回给我的内容并将其恢复为正确的编码和正确的字节数组,但我已经尝试了很多。

请注意,我正在使用 WP7 受限 API。

希望大家能帮忙。

谢谢!

更新寻求帮助...

如果我执行以下代码,那几乎是正确的,唯一错误的是倒数第 5 个字节被拆分。

byte[] writeBuf1 = System.Text.Encoding.UTF8.GetBytes(data);
                    string buf1string = System.Text.Encoding.BigEndianUnicode.GetString(writeBuf1, 0, writeBuf1.Length);
                    byte[] writeBuf = System.Text.Encoding.BigEndianUnicode.GetBytes(buf1string);

【问题讨论】:

  • 你能告诉我们编写/创建数组的代码吗?
  • 不,它来自第三方服务,这是服务返回的确切数据...此外,我只是想让它恢复到它应该是的状态(因为它在响应流)
  • 我对这个非常困惑......
  • 那你怎么知道流是以什么编码和字节顺序写入的呢?
  • 你能附加一个网络嗅探器(Fiddler)来查看实际传输的内容吗?

标签: windows-phone-7 c#-4.0 encoding bytearray


【解决方案1】:

原始字节数组没有编码为 UTF-8。因此StreamReaderreplacement character U+FFFD 替换每个无效字节。当该字符被编码回 UTF-8 时,这将产生字节序列EF BF BD。您无法从字符串构造原始字节值,因为信息已完全丢失。

【讨论】:

  • 这就是我所害怕的......所以真正不丢失数据的唯一方法是弄清楚编码是什么并像那样阅读?不幸的是,由于某种原因,我不能只读取一个字节数组,Stream 需要一个流读取器来读取......
  • 是的,如果您有疑问,请使用ISO-8859-1,这样您将获得从字节到字符的简单 1:1 映射。只是为了好奇:为什么有人想将这样的字节流(显然是非字符数据)作为字符流读取?
  • 你不能向流的来源询问规范吗?
  • 除了这一新部分之外,一切都是(并且一直是)字符数据。不管怎样,我只是添加了一些覆盖来获得实际的 byte[] 可选,并且在 ISO-8859-1 编码中看起来一切都很好。谢谢!
  • 哇,天哪,所以这些字节是使用错误编码的很好标记!
猜你喜欢
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2011-06-28
  • 2020-04-03
  • 2018-06-20
  • 2011-08-25
相关资源
最近更新 更多