【问题标题】:C++ base64 encoding - PHP compatibleC++ base64 编码 - PHP 兼容
【发布时间】:2011-11-24 12:31:20
【问题描述】:

我有一个桌面应用程序,它可以创建大约 2-3k 的二进制数据并将其发布到 Web 服务器。我已经使用HttpSendRequest 完成了发布文章,它适用于文本,但显然无法使用二进制文件。从我的研究看来,我需要 base64 对我的 c++ 应用程序中的数据进行编码,然后在 PHP 中使用 base64_decode 来存储这些数据。

我已经下载了几个设计用于在base64 中编码的 c/c++ 文件,但是它们要么根本不起作用,要么编码与 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. 我用来发布数据的代码:http://pastebin.com/L856rKmw

我不确定哪里出了问题,但如果能帮助解决这个问题,我们将不胜感激!

-- 更新 2-- POST 过程将编码数据中的 + 字符更改为空格。请参阅以下内容:

从 C++ 发布的数据:http://pastebin.com/NiSE7GUe

通过 FTP 复制到服务器:http://pastebin.com/S0qjfreM

后期处理会改变这个字符是否有合理的原因?我更愿意了解并解决实际问题,但也许执行字符串替换就足以最终解决这个问题?

【问题讨论】:

标签: php c++ encoding base64


【解决方案1】:

Base64 是一种定义良好的编码机制 - 因此实现之间不应存在不一致。如果您看到使用不同实现的一致失败,则问题出在编码算法之外。

您可以通过简单地将输出转储到文件(甚至控制台)来进行测试。

确实,虽然编码方法相对稳健,但有些字符可能具有特殊含义,具体取决于它们出现的上下文(URL、POST、Html)。再加上 HTTP 和大多数 HTTP 客户端实现不同的传输和内容编码这一事实可能会导致额外的混乱。

如果我们看到您用于准备数据和调用 HttpSendRequest 的代码可能会有所帮助

【讨论】:

  • 我在这里粘贴了我的 http 代码:pastebin.com/L856rKmw,并用更多细节更新了我的问题。
  • 我认为您会发现它发送数据的方式 - 尝试发送一些纯文本(代替 base64 编码数据),您应该会看到发生了什么
  • 是的,我可以成功发送标准文本,例如“fname=john&lname=smith&email=johnsmith@gmail.com”。如果我附加“&data=encodedstring”并发布,我似乎没有得到完整(或正确)的数据。我应该使用更好的方法将二进制数据传输到我的 Web 服务器吗?
  • ...当您使用带有 urlencoding 敏感字符(例如空格、'+'、'?' 等)的“痛苦文本”字符串时会发生什么?
【解决方案2】:

您可以使用libb64 对您的输入进行base64 编码,但是base64 编码是相当标准的,所以当您说其他库生成的编码与PHP 不兼容时,我怀疑您可能做错了。

您是否尝试过将 base64 编码数据写入文件,然后使用 PHP 读取?这样,您至少可以消除(似乎不太可能)编码不兼容的可能性。

编辑:

从您发布的额外信息来看,您在将 base64 数据发送到 HttpSendRequest 之前可能没有正确地对其进行 URL 编码。 Base64虽然是基于文本的,但在url编码中仍然使用了一些具有不同含义的字符,

阅读this 以了解编码的说明。我怀疑这就是为什么你的 base 64 字符串中的 + 到达 PHP 时丢失的原因,因为 URL 编码中的 + 实际上意味着空格。

因此,您应该在发送到 HttpSendRequest 之前尝试对字符串进行 URL 编码。我无法命名任何 API 来完成这项工作,但它应该足够简单,可以编写一个处理所有 base64 字符的 API。至少您需要将+ 的实例替换为%2B

好像是 PHP 为你做解码,所以它应该只需要在发送前编码,而不是在你接收时解码。

【讨论】:

  • 我通过 POST 方法或通过 FTP 上传比较了同一文件的版本。我不确定原因,但看起来 + 字符在 POST 时被转换为空格。
  • @jimmy 现在阅读我的答案,我很确定它可以解释问题
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 2012-10-27
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多