3

我知道有许多类型的编码和解码,从我读过的内容来看,base64 在编码二进制文件(图像、mp3、视频)时是一个很好的选择。

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

在这里,我注意到我有几个选择用于获取字符串,例如 ASCII、UNICODE、DEFAULT。

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

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

尽管如此,还是有几个字符无法读取。有人对此问题陈述有解决方案吗?非常感谢任何反馈。感谢提前。

4

4 回答 4

5

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

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

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

BASE64 编码应该如何工作是:

  1. 获取二进制数据为byte[]
  2. 从创建 BASE64 字符串byte[]
  3. 传输 BASE64 字符串
  4. byte[]从 BASE64 字符串创建
  5. 继续合作byte[]
于 2012-10-12T07:21:26.910 回答
4

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

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

有问题;这里没有字符串值。“图像、mp3、视频”根本不是“字符串值”。您可以做的是将 base-64 解码回原始二进制文件(在 java 或 c# 中都很简单),但这就是您所能做的。如果您需要原始二进制文件中的“字符串值”,您唯一能做的就是通过 base-64(这将使您恢复开始时的内容)或其他一些 base-n 重新编码。

仅当已知二进制数据实际上是以该编码存储的文本数据时,诸如 ASCII 或 UTF-8 之类的文本编码才有意义。您不能使用 UTF-8 来“解码”实际上不是 UTF-8 的二进制文件。

于 2012-10-12T07:28:35.450 回答
1

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

于 2012-10-12T07:28:55.117 回答
1
  1. 使用 UTF-8 (或其他,如果你有原因的话)编码将字符串对象(Java 或 C#)转换为字节数组。
  2. 您现在有了二进制数据,具体来说是 UTF-8 编码的文本。如果您需要将其传输到不支持原始二进制数据或 UTF-8 文本的某个地方,或者如果您不想担心某些字符(如 XML 中的特殊含义),请使用 base64 编码将其转换为 ASCII 字符串
  3. 用 ASCII 字符串做任何你想做的事情(base64 甚至允许一些空格修饰等)来把它送到解码器。
  4. 使用 base64 decode 将 ASCII 字符串转换回字节数组
  5. 使用 UTF-8 编码将字节数组转换回字符串对象(C# 或 Java)

如果二进制数据或 UTF-8 文本都可以,则可以跳过第 2 步和第 4 步。但是需要第 1 步和第 5 步,因为在 C# 和 Java 等语言中,字符串是“逻辑字符”,它不是可以存储或传输的字节(当然它是内存中的字节,通常是 UTF-16 或 UTF-32,但你不应该关心这些)。必须使用某种编码将其转换为字节。UTF-x 是唯一不会丢失任何字符的字符,如果大多数字符来自“西方”字母表,则 UTF-8 是最节省空间的。

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

二进制文件的步骤:

  1. 将二进制文件(如 PNG 图像文件)的内容获取到字节数组。
  2. 与上述第 2 步相同,但数据不是 UTF-8。
  3. 与上述第 3 步相同
  4. 与上述第 4 步相同
  5. 您现在拥有包含步骤 1 中的 PNG 文件内容的字节数组。
于 2012-10-12T07:34:28.357 回答