2014-03-28 60 views
1

我有一个字节数组,从映像文件中读取,我试图从C#跨套接字发送到运行collectionFS(v0.3.7)的Meteor服务器。从字节数组创建正确转义的字符串

我试图将其转换为一个字符串,结果我就从在JavaScript调用FileReader.readAsBinaryString()得到匹配,例如:

?PNG\r\n\u001a\n\u0000\u0000\u0000\rIHDR\u0000\u0000\u0003?\u0000\u0000\u0002? 

在我的C#代码,我一直在使用System.Text.Encoding.UTF8.GetString()试过了,这给了我像这样:

�PNG\r\n\n\0\0\0\rIHDR\0\0�\0\0 

这在传输上失败,大概是因为'\ 0'被视为像字符串的结尾。

任何人都可以更好地解释这里发生了什么?在C#中使用像readAsBinaryString()这样的unicode转义序列来格式化字节是否有一个好方法?

编辑:这个数据的最终目的地是MongoDB(流星)中的BSON二进制条目,稍后将被提取(作为Blob)并通过普通的Meteor Web浏览器客户端进行查看。

+0

只会编码的每一个字节为十六进制的工作(要容易得多,大量重复的)? –

+0

我可以尝试,虽然我怀疑它需要unicode出于某种原因转义。我会更新这个问题,但是这个数据的最终目的地是MongoDB中的BSON二进制条目。 – WildCrustacean

回答

1

没有内置的方法可以做到这一点。

要将字节数组转换为编码,您需要确定什么是编码,哪些不是。貌似0-9a-zA-Z范围不应该被编码,其余编码为\uXXXX

我这样做如下:

var result = String.Join("", byteArray 
    .Select(b => b >'0' && b <'9' ? 
     (char)b.ToString() : String.Format(@"\u{0:x4}", b))); 
+0

有趣的是,这主要起作用,但我不得不将它改成'((char)b.ToString())'。我不明白这种编码,它似乎是一些奇怪的混合系统。虽然谢谢! – WildCrustacean

+0

@WildCrustacean - 内嵌你的代码修复 - 谢谢。如果您决定不应转换超过0-9个字符,请考虑将“不转换字节”的检查转换为“HashSet.Contains”。 –