c++ base64编码- PHP兼容


C++ base64 encoding - PHP compatible

我有一个桌面应用程序,创建并发布大约2-3k的二进制数据到web服务器。我已经使用HttpSendRequest解决了张贴件,它与文本一起工作得很好,但显然与二进制失败。从我的研究看来,我需要base64编码的数据从我的c++应用程序,然后使用base64_decod e在PHP存储此数据。

我已经下载了几个c/c++文件设计在base64编码,但要么他们根本不工作,或者编码不兼容的PHP编码。

我想我的问题是:

  1. 我这样做对吗?是否有更好的格式来传输这些数据?
  2. 有没有人知道一个简单的类或其他c++代码,可以帮助我以适当的格式编码这些数据?

——更新——我一直在玩这个过去的一天,现在比以往任何时候都更加困惑。数据如下:

  1. 原始二进制数据:http://pastebin.com/cPWjGN3q
  2. 在c++中base64编码后:http://pastebin.com/H4Jze96g
  3. 以php编码上传:http://pastebin.com/MRLZrsve
  4. php解码:http://pastebin.com/TJs5WCNj
  5. 我用来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为您做了解码,所以应该只需要在发送前编码,而不是在接收时解码。