- 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/
有没有人有嵌套 Intent 的好例子,尤其是在 #yes 和 #no 是子节点的情况下。我得到的情况是 API 返回的是 Intent 值,但输出文本来自“Anything else”! 最佳答案
我知道您可以转到 Watson Conversation 界面,右键单击工作区,然后下载工作区的 JSON,其中包含意图,如下所示:Is there any way to export intents
我能否在 Watson Conversation API 的对话流中使用节点条件中的意图置信度评级? 最佳答案 要做到这一点,请创建一个条件来寻找您的意图,然后检查置信度。 你会拥有的示例条件 #te
我找到了很多关于这个错误的帖子,但我可以找到克服它的方法。这是触发错误的代码: void main(){ float f{1.3}; } 为什么在初始化列表中没有像其他变量那样发生转换?例如,
我有以下代码。 #include using namespace std; class Base { public: virtual int f(){coutf(); ///base
Visual C++ 2017 和 gcc 5.4 产生 conversion from 'const unsigned char' to 'const float' requires a narro
我正在为 PIC18F2420 使用带有 xc8 1.35 编译器的 MPLABX 3.20,我收到了两个我不理解的奇怪警告: 这是生成警告的源代码之一 9 void write(Pin _Pin,
我正在尝试在 win32 API(无 mfc)上编写一些直接的 c++。有了这个更现代的 c++ 编译器,我得到: 警告 C4838:从“unsigned int”到“int”的转换需要收缩转换 它发
此代码采用用户输入(字符 C、T、B)和(int 0-24 和 0-60)来计算 parking 成本关于用户输入的车辆类型。 我怀疑错误发生在函数 charged 中,因此我无法在收到此错误的最后一
为什么在使用 tuple 或 Tuple 转换向量时会得到以下不同的结果? julia> a = [1, 2, 3] 3-element Vector{Int64}: 1 2 3 julia> tup
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
我正在开发一个文件共享网站,我需要一种方法来对上传的文档进行截图。 该站点将支持多种文件格式,从纯文本到办公文档(doc、xls、ppt...)、视频(mpeg、avi...)、图像(jpg、gif、
在 VHDL 中是否有将整数类型对象转换为实数类型的通用转换函数? 这是针对测试平台的,因此可综合性不是问题。 最佳答案 您可以将整数转换为实数,如下所示: signal i: integer; si
如何在 Ocaml 中将字符串选项数据类型转换为字符串? let function1 data = match data with None -> "" | Some str -> s
我已经在 VHDL 中编写了一个算法,但是我有一条消息,我不明白“sra/sla 在这种情况下不能有这样的操作数。”。请问有什么帮助吗? library ieee; use ieee.std_logi
我经常需要将数据从一种类型转换为另一种类型,然后进行比较。一些运算符会先转换为特定类型,这种转换可能会导致效率损失。例如,我可能有 my $a, $b = 0, "foo"; # initial va
假设我在 IBM Watson 中配置了一个对话服务,可以识别以单词和片段形式给出的数字。例如,如果我有号码 1320 , 可以发送为 thirteen twenty或 thirteen two ze
也许我错过了一些显而易见的事情...在整个文档中,我似乎都认为Kotlin具有各种类型的序列,这些序列不能互操作。即使复制序列可能效率不高–当我需要将其作为语义相同但不同的类型传递给函数时,这也无济于
在我的Linux终端中,我想要使用QTcpSocket从qt运行以下“对话”: S user@domain:~ $ netcat 1.1.1.2 9230 R HELO SOME MORE I
我有一个模板函数,其中枚举类型转换为它的底层类型,工作正常,但我写了一个重载,它应该接受一个整数并返回它自己,它给我一个错误,指出 int 不是枚举类型。在我的模板中,这应该已经被过滤掉了。怎么了?
我是一名优秀的程序员,十分优秀!