html – 奇怪的Base64编码/解码问题

栏目: Html · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/5628738/strange-base64-encode-decode-problem

我使用Grails 1.3.7.我有一些代码使用内置的base64Encode函数和base64Decode函数.在一些简单的测试用例中,一切都可以正常工作,在这些情况下,我会对一些二进制数据进行编码,然后解码生成的字符串并将其写入一个在这种情况下,文件是相同的.

但是后来我写了一个Web服务,将base64编码的数据作为POST调用中的一个参数.尽管base64数据的长度与传入函数的字符串相同,但是base64数据的内容正在被修改.我花了DAYS调试这个,最后写了一个测试控制器,它将base64中的数据传递给post,并且使用正确的base64编码数据的本地文件的名称,如:

data=AAA-base-64-data...&testFilename=/name/of/file/with/base64data

在测试函数中,我将输入数据参数中的每个字节与测试文件中的相应字节进行了比较.我发现输入数据参数中的每个“”字符都被替换为“”(空格,序号ascii 32).咦?该怎么办?

为了确定我是对的,我补充说:

data = data.replaceAll(' ', '+')

并且确切地说,数据解码完全正确.我尝试了任意长的二进制文件,它现在每次都工作.但是,我不知道我的生活中将修改post的数据参数将ord(43)字符转换为ord(32)?我知道这个加号是base64规格中两个有点依赖平台的字符之一,但是由于我现在在同一台机器上进行编码和解码,所以我对此造成了很大的困惑.当然我有一个“修复”,因为我可以使它的工作,但我很紧张的“修复”,我不明白.

代码太大,不能在这里发布,但是我得到base64编码如下:

def inputFile = new File(inputFilename)
def rawData =  inputFile.getBytes()
def encoded = rawData.encodeBase64().toString()

然后我将编码的字符串写入新的文件,以便稍后使用它进行测试.如果我加载该文件,所以我得到相同的rawData:

def encodedFile = new File(encodedFilename)
String encoded = encodedFile.getText()
byte[] rawData = encoded.decodeBase64()

所以这一切都很好.现在假设我使用“编码”变量并将其添加到POST函数的参数中,如下所示:

String queryString = "data=$encoded"
String url = "http://localhost:8080/some_web_service"

def results = urlPost(url, queryString)

def urlPost(String urlString, String queryString) {
    def url = new URL(urlString)
    def connection = url.openConnection()
    connection.setRequestMethod("POST")
    connection.doOutput = true

    def writer = new OutputStreamWriter(connection.outputStream)
    writer.write(queryString)
    writer.flush()
    writer.close()
    connection.connect()

    return (connection.responseCode == 200) ? connection.content.text : "error                         $connection.responseCode, $connection.responseMessage"
}

在Web服务端,在控制器中我得到如下参数:

String data = params?.data
println "incoming data parameter has length of ${data.size()}" //confirm right size

//unless I run the following line, the data does not decode to the same source
data = data.replaceAll(' ', '+')

//as long as I replace spaces with plus, this decodes correctly, why?
byte[] bytedata = data.decodeBase64()

对不起长期的咆哮,但我真的很想明白为什么我必须做“替换空格加号”,以使其正确解码.请求参数中使用的加号有什么问题吗?

无论什么填充参数,希望请求是URL编码的形式(具体来说,应用程序/ x-www-form-urlencoded,其中“”表示空格),但是没有对其进行URL编码.我不知道你的语言提供了什么功能,但是在伪代码中,queryString应该被构建

concat(uri_escape("data"), "=", uri_escape(base64_encode(rawBytes)))

这简化了

concat("data=", uri_escape(base64_encode(rawBytes)))

“”“字符将被替换为”+“.

http://stackoverflow.com/questions/5628738/strange-base64-encode-decode-problem


以上所述就是小编给大家介绍的《html – 奇怪的Base64编码/解码问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深度探索C++对象模型(影印版)

深度探索C++对象模型(影印版)

Stanley B. Lippman / 中国电力出版社 / 2003-8-1 / 42.00

本书重点介绍了C++面向对象程序设计的底层机制,包括结构式语意、暂时性对象的生成、封装、继承和虚拟——虚拟函数和虚拟继承。书中向你表明:理解底层实现模型,可以极大地提高你的编码效率。Lippman澄清了那些关于C++系统开销与复杂性的各种错误信息和猜测,指出了其中某些成本和利益交换确实存在。他在书中详述了各种实现模型,指出了它们的发展方向以及促使其发展的根本原因。本书涵盖了C++对象模型的语意暗示......一起来看看 《深度探索C++对象模型(影印版)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具