- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在将文本转换为 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/
我在这方面需要澄清。我觉得Static library和Dynamic Library这两个术语不正确。 lib1.o + lib2.o + lib3.o->“LinkerOutputFile”(可执
我想为多类多标签分类建立一个混淆矩阵,然后计算精度、召回率和 F1。 一个想法是从训练和测试集中的所有组合中构建它,例如 A1 A2A3 A1A3 A1 x x x A
我希望这是一个非常简单的问题,在 Android 中什么相当于在 PHP 中执行此操作: PHP: 函数 BlahBlah ($first_var,$second_var,$optional_var_
我正在努力理解递归,我想我已经明白了......我正在尝试构建一个搜索函数(如 std::string.find()),用于在给定字符串中搜索另一个字符串例如: Given (big) string:
我有一个列表,其中包含有关用户网络浏览器的信息。该列表由 PHP 通过用户需求调查生成。输出如下所示:(示例): Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1;Trid
这是我在这里的第一个问题,所以如果我违反了任何规则,或者没有使用正确的格式,请原谅我 我正在用 java swing 创建一个简单的表单,它由 1 个 JLabel、1 个 JTextField 和
使用分段包创建分段线性回归我在尝试设置自己的断点时看到错误;似乎只有当我尝试设置两个以上时。 (编辑)这是我正在使用的代码: # data bullard <- structure(list(Rt =
据我了解,调用 NSLog(@"Local Time Zone %@",[[NSTimeZone localTimeZone] name]); 为您提供设备的本地时区。它给我的是“US/Central
假设我有一个名为 Navbar 的模板,它包含在 Main 和 About 页面中。在 Navbar 模板中,我有一个搜索栏组件,我只想在 Main 模板上显示它。我定义了一个辅助函数,如下所示: T
我正在 Java 中进行分配,我应该使用我在我的项目中导入的 enumeration 类型 MONTH项目。我的老师写道:“有一个特殊的函数可以将数字转换为月份:月.月(8)”。 我已经写了Month
有同学问我,既然操作系统是扩展机或者虚拟机,那么编译器在生成C程序的汇编代码时是否需要知道寄存器的数量,或者处理器的指令的数量。 我花了一段时间在互联网上搜索,这就是我的想法...... 它不需要知道
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我正在尝试理解 initstate 和 initstate_r 的联机帮助页。这两个函数都在初始化随机生成器。如果您有多个线程,则不应使用 initstate,但对于这种情况,您应该使用 initst
据说: When it would yield a class method object, it is transformed into a bound user-defined method ob
我正在学习 JS 函数式编程,并使用 Ramda 进行。 我正在尝试创建一个接受参数并返回列表的函数。这是代码: const list = R.unapply(R.identity); list(1,
我试图在按下“提交”按钮后显示用于“页面加载”的相同加载器。 在页面的最顶部我有: (“gabbia”只是一个容器,而“load_screen”和“loader”是用 css 格式化以获得一个漂亮的
#include #include #define SQUARE(x) (x*x) void main() { clrscr(); int i=3,j,k; j=
#include using namespace std; int myFunc (unsigned short int x ); int main () { unsigned short
在 http://hollywoodnose.com我根据每个页面有多少图片有条件广告。因此,如果有一张图片,我将使用 468 x 60。如果有 4 张图片,我将在第二张图片之后显示 180 x 15
我有一个在数据库上执行全文搜索的搜索查询。 $sql = "SELECT * FROM `tbl_auction_listing` AS `al` JOIN `tbl_user` AS `u` ON
我是一名优秀的程序员,十分优秀!