我在将文本转换为 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”

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

解决方法

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

如您所知,base64编码是将真正的二进制数据(范围为0到255)转换为稍大的二进制数据数组的过程(其中每个字节保证与32位之间的ASCII可打印字符具有相同的值.和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中,修复在概念上是相同的.不要使用String.使用字节数组.

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

再次 – 答案是mQ ==

最后,在编码之后,使用字符串完全没问题.您的字符在ASCII子集中,字符串和字节数组之间的任何转换都不会损坏数据,因为所有字符集都与ASCII子集一致.

请记住,您将以相反的顺序出现相同的问题 – 解码.您将解码为字节数组,此时您将返回真正的二进制数.从这一点开始,数据绝不能存储为字符串 – 直到你完成它 – ex.将其解密回原始明文.

希望这可以帮助.

Java和.NET:Base64转换混乱的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 使用canvas压缩图片大小的方法示例

    这篇文章主要介绍了使用canvas压缩图片大小的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. 手对手的教你用canvas画一个简单的海报的方法示例

    企业的广告投入开始从电视等传统媒体向基于圈层文化的新媒体精准营销转移,很多人都想制作一张属于自己的海报,本文介绍了手对手的教你用canvas画一个简单的海报的方法示例,感兴趣的可以了解一下

  4. 浅谈移动端网页图片预加载方案

    这篇文章主要介绍了浅谈移动端网页图片预加载方案 的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. 使用html2canvas实现将html内容写入到canvas中生成图片

    这篇文章主要介绍了使用html2canvas实现将html内容写入到canvas中生成图片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Canvas与图片压缩的示例代码

    本篇文章主要介绍了Canvas与图片压缩的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. web字体加载方案优化小结

    这篇文章主要介绍了web字体加载方案优化小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部