c++ base64编码- PHP兼容
C++ base64 encoding - PHP compatible
我有一个桌面应用程序,创建并发布大约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为您做了解码,所以应该只需要在发送前编码,而不是在接收时解码。
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 布局兼容类型的并集
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 指针问题:从不兼容的类型"int"分配给"int *"
- 如何以与 API 兼容的方式重命名类成员?
- 将加密消息从 php 发送到 C++ 应用程序,然后使用 CryptoPP 进行解密
- 使用不兼容的分配器复制分配无序列图
- 分配兼容的向量?
- 自定义 STL 兼容迭代器,用于迭代 2D 数组类的列
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- C/C++:POSIX 兼容方式查找默认网络接口上/下
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- c++ base64编码- PHP兼容