java和c#中二进制文件的最佳编码解码

时间:2012-10-12 07:16:12

标签: c# java decode binaryfiles

我知道有很多类型的编码和解码,根据我的阅读,base64是编码二进制文件(图像,mp3,视频)的绝佳选择。

现在,在解码时,我需要从base64转换然后获取字符串值。解码后获取字符串的过程,我需要这样做(在c#中):System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

在这里我注意到我有多种选择来获取字符串,例如ASCII,UNICODE,DEFAULT。

这篇文章中真正的问题是如果我使用java编码和c#来解码二进制文件,我应该使用什么是最好的解决方案/选择?我尝试了几种方法,但有些字符无法读取,因此会给出问号符号(?)。

然而,可以读取该字节的最接近的编码解码就是当我在Java中使用它时:String encoded = Base64.encodeToString(fileData, Base64.CRLF);同时在c#im中使用如下:byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); string returnValue = System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

但是,有几个字符无法读取。有没有人有这个问题陈述的解决方案?任何反馈都非常感谢。谢谢你的进步。

4 个答案:

答案 0 :(得分:5)

关于二进制文件的问题是它们是二进制(类型byte[])。大多数情况下你不能将字节直接转换为字符串(使用Encoding.GetString(byte[])),因为它们中的一些可能具有无法用字符串表示的值(这就是你正在经历)。

使用Encoding.GetString(byte[])将二进制数据转换为字符串以将其转换为BASE64完全没有意义,因为在将二进制信息转换为字符串时丢失信息 - 您需要将其直接转换为BASE64。 / p>

将字节数组的BASE64字符串表示形式转换为byte[]是正常的 - 这样可以返回原始二进制数据。但是,由于我上面给出的原因,将此byte[]转换为string并不正常。

BASE64编码应该如何工作:

  1. 获取二进制数据为byte[]
  2. byte[]
  3. 创建BASE64字符串
  4. 转移BASE64字符串
  5. 从BASE64字符串
  6. 创建byte[]
  7. 继续使用byte[]

答案 1 :(得分:3)

你说那个输入是“图像,mp3,视频”,所以:任意二进制。然后,您声明您使用的是base-64,这意味着:由于某种原因,您需要将此数据作为字符串传输/存储(注意:传输/存储作为原始二进制文件通常是首选 - base-64具有开销)。 / p>

  

现在,在解码时,我需要从base64转换然后获取字符串值。

有问题; 这里没有字符串值。 “图像,mp3,视频”根本不是“字符串值”。你可以做的是从base-64解码回原始二进制文件(java或c#中的普通文件),但就是你能做的所有。如果你需要来自原始二进制文件的“字符串值”,你唯一能做的就是通过base-64重新编码它(它会让你回到你开始的那个),或者其他一些base-n。

如果已知二进制数据实际上是存储在该编码中的文本数据,则只有ASCII或UTF-8等文本编码才有意义。您不能使用UTF-8来“解码”实际上不是UTF-8的二进制文件。

答案 2 :(得分:1)

如果您想在解码数据后获取字符串,则意味着您的数据以某种方式呈现为文本格式。如果是这种情况,您应该了解文件的初始编码,例如UTF-8。然后你可以正确解码字符串。如果您的程序只将文件从一个地方传输到另一个地方而不对其内容做任何事情,那么最好在解码时保留它们。

答案 3 :(得分:1)

  1. 使用UTF-8 (或其他一些,如果您有理由)将字符串对象(Java或C#)转换为字节数组。
  2. 您现在拥有特定的二进制数据,UTF-8编码文本。如果你需要将它转移到某个地方,它不支持原始二进制数据或UTF-8文本,或者如果你不想担心某些具有特殊含义的字符(如XML),使用base64编码将其转换为ASCII字符串即可。
  3. 使用ASCII字符串做任何(base64甚至允许一些空格修改等)将其转换为解码器。
  4. 使用base64解码将ASCII字符串转换回字节数组
  5. 使用UTF-8编码将字节数组转换回字符串对象(C#或Java)
  6. 如果二进制数据或UTF-8文本没问题,你可以跳过第2步和第4步。但是需要1和5,因为在C#和Java等语言中,字符串是“逻辑字符”,它不是字节你可以存储或传输(当然它在内存中的字节,通常是UTF-16或UTF-32,但你不应该关心它)。必须使用某种编码将其转换为字节。 UTF-x是唯一不丢失任何字符的字符,如果大多数字符来自“西方”字母,UTF-8最节省空间。

    关于base64的一个特殊之处在于,虽然它实际上是7位ASCII字符,但您可以使用任何字符串编码将base64编码的文本放入C#/ Java字符串对象并返回到base64编码的字节数组,因为所有字符串编码都在use是7位ASCII的超集。因此,您可以获取图像数据,base64对其进行编码,并将生成的文本放入String对象,而无需担心编码和损坏。

    二进制文件的步骤:

    1. 获取像PNG图像文件这样的二进制文件的内容到字节数组。
    2. 与上面的第2步相同,但数据不是UTF-8。
    3. 与上面的第3步相同
    4. 与上面的第4步相同
    5. 您现在拥有包含步骤1中的PNG文件内容的字节数组。