我有一个桌面应用程序,创建并发布大约2-3k的二进制数据到web服务器。我已经使用HttpSendRequest
解决了张贴件,它与文本一起工作得很好,但显然与二进制失败。从我的研究看来,我需要base64
编码的数据从我的c++应用程序,然后使用base64_decod
e在PHP存储此数据。
我已经下载了几个c/c++文件设计在base64
编码,但要么他们根本不工作,或者编码不兼容的PHP编码。
我想我的问题是:
- 我这样做对吗?是否有更好的格式来传输这些数据?
- 有没有人知道一个简单的类或其他c++代码,可以帮助我以适当的格式编码这些数据?
——更新——我一直在玩这个过去的一天,现在比以往任何时候都更加困惑。数据如下:
- 原始二进制数据:http://pastebin.com/cPWjGN3q
- 在c++中base64编码后:http://pastebin.com/H4Jze96g
- 以php编码上传:http://pastebin.com/MRLZrsve
- php解码:http://pastebin.com/TJs5WCNj
- 我用来POST数据的代码:http://pastebin.com/L856rKmw。
我不知道哪里出了问题,但任何帮助得到这将是非常感激的!
——UPDATE 2——POST过程将编码数据中的+字符更改为空格。
来自c++的数据:http://pastebin.com/NiSE7GUe
通过FTP复制到服务器:http://pastebin.com/S0qjfreM
是否有一个逻辑上的原因,为什么后处理会改变这个字符?我更愿意理解和解决实际问题,但也许执行字符串替换将足以最终解决这个问题?
Base64是一种定义良好的编码机制,因此实现之间不应该有不一致之处。如果你在使用不同的实现时看到一致的失败,那么问题就出在编码算法以外的地方。
您可以通过将输出转储到文件(甚至控制台)来测试这一点。
确实,虽然编码方法相对健壮,但有一些字符可以根据它们出现的上下文(URL, POST, Html)具有特殊含义。除此之外,HTTP和大多数HTTP客户端实现不同的传输和内容编码可能会造成额外的混乱。
如果我们看到你正在使用什么代码准备数据和调用httpendrequest
您可以使用libb64来对输入进行base64编码,但是base64编码是相当标准的,所以当您说其他库产生与PHP不兼容的编码时,我怀疑您可能做错了什么。
您是否尝试过将base64编码的数据写入文件,然后用PHP读取?这样至少可以消除(看似不太可能)编码不兼容的可能性。
编辑:从您发布的额外信息来看,在将base64数据发送到httpendrequest之前,您可能没有正确地对其进行URL编码。Base64虽然基于文本,但仍然使用一些在url编码中具有不同含义的字符,
阅读这段代码,了解编码的解释。我怀疑这就是为什么你的base 64字符串中的+'s在到达PHP时丢失的原因,因为URL编码中的+实际上意味着空格。
所以,你应该在发送到httpendrequest之前尝试URL编码字符串。我想不出任何api来完成它,但是编写一个处理所有base64字符的api应该足够简单。至少您需要将+
的实例替换为%2B
似乎PHP为您做了解码,所以应该只需要在发送前编码,而不是在接收时解码。