gpt4 book ai didi

Java 和 .NET : Base64 conversion confusion

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:59:32 25 4
gpt4 key购买 nike

我在将文本转换为 Java (Android) 和 .NET (Visual Basic) 中的 Base64 字符串时遇到问题。 ASCII 字符的普通(可读)形式可以很好地转换。但是当涉及到特殊字符(代码大于 128 的字符)时,它们给我带来了麻烦。

例如,我尝试转换 ASCII 值为 65 的字符代码(字符“A”)。

我的 Java 代码是:

char a = 65;
String c = String.valueOf(a);
byte bt[] = c.getBytes();
String result = Base64.encodeToString(bt, Base64.DEFAULT);

我的 .NET 代码是:

Dim c As String = Chr(65)
Dim result as String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(c))

它们都返回相同的结果:“QQ==”。这可以。但是当我尝试转换一个特殊字符时,例如字符代码 153。然后它返回不同的结果。

char a = 153;
String c = String.valueOf(a);
byte bt[] = c.getBytes();
String result = Base64.encodeToString(bt, Base64.DEFAULT);

返回“wpk=”

和我相同的 .NET 代码:

Dim c As String = Chr(153) 
Dim result as String = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(c))

返回“4oSi”

这太奇怪了。这里有什么问题。我在两个平台上都使用 native Base64 库。我的代码有问题吗?

最佳答案

由于您正在编码的数据是加密数据 - 任何字节可以从 0 到 255 的随机数据,并且在其加密状态下,没有字符或文本含义,您需要将此信息视为 - 让我们称之为- 真正的二进制数据。 Java 和 .NET 都通过各自的字节数组原语完全支持真正的二进制数据。

如您所知,base64 编码是将真正的二进制数据(范围为 0 到 255)转换为稍大的二进制数据数组(其中每个字节保证具有与 ASCII 可打印字符相同的值)的过程介于 32 和 126 之间)。我们称此为编码二进制。然后可以将编码的二进制安全地转换为文本,因为几乎每个已知字符集都同意可打印的 ASCII 字符集(32 到 126)。

所以 Java 和 VB.NET 片段的主要问题是您试图使用文本原语——Java 中的 char 和 String; VB.NET 中的字符串,用于存储真正的二进制 数据。一旦你这样做就太晚了。没有办法将它可靠地转换回字节数组,因为文本基元的设计根本不是为了安全地存储和检索二进制数据。有关为什么会这样的更多信息,请阅读 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

幸运的是,修复很简单。对于 Java,不要使用 char 和 String 来存储二进制数据。将数据直接放入字节数组。尝试以下操作:

  byte [] bt = new byte[1];
bt[0] = (byte) 153;
String result = Base64.encodeToString(bt, Base64.DEFAULT);

我得到 mQ==

修复在 VB.NET 中在概念上是相同的。不要使用字符串。使用字节数组。

    Dim bytes() As Byte = New Byte() {153}
Dim result As String = Convert.ToBase64String(bytes)

同样 - 答案是 mQ==

最后,经过编码,使用Strings就完全没问题了。您的字符位于 ASCII 子集中,字符串和字节数组之间的任何转换都不会破坏数据,因为所有字符集都同意 ASCII 子集。

请记住,您将遇到相同的问题,但顺序相反 - 解码。您将解码为字节数组,此时您将返回到 true binary。从这一点开始,数据绝不能存储为字符串 - 直到你完成它 - 例如。将其解密回原始明文。

希望这对您有所帮助。

关于Java 和 .NET : Base64 conversion confusion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com