C ++ base64编码 - PHP兼容

时间:2011-11-24 12:31:21

标签: php c++ encoding base64

我有一个桌面应用程序,可以创建并向Web服务器发布大约2-3k的二进制数据。我已经使用HttpSendRequest制作了发布文章,这对文本非常有效,但显然无法使用二进制文件。从我的研究看起来我需要{c}来编译来自我的c ++应用程序的数据,然后在PHP中使用base64 e来存储这些数据。

我已经下载了几个用于base64_decod编码的c / c ++文件,但要么它们根本不起作用,要么编码与PHP编码不兼容。

我想我的问题是:

  1. 我是以正确的方式来做这件事的吗?是否有更好的格式来传输这些数据?
  2. 是否有人知道一个简单的类或其他c ++代码可以帮助我以正确的格式对这些数据进行编码?
  3. - 更新 - 过去一天我一直在玩这个,现在比以往更加困惑。这是数据:

    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
    6. 我不确定哪里出了问题,但是任何有助于理顺这一点的帮助都将不胜感激!

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

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

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

      为什么后期处理会改变这个角色有合理的理由吗?我更愿意理解并解决实际问题,但是执行字符串替换可能足以最终解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

Base64是一种定义良好的编码机制 - 因此实现之间不应存在不一致。如果你看到使用不同实现的一致失败,那么问题就在于编码算法以外的其他地方。

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

实际上,虽然编码方法相对健壮,但有些字符可能具有特殊含义,具体取决于它们出现的上下文(URL,POST,Html)。除此之外,HTTP和大多数http客户端实现不同的传输和内容编码这一事实可能会引起额外的混淆。

如果我们看到您使用哪些代码来准备数据并调用HttpSendRequest

,这可能有所帮助

答案 1 :(得分:0)

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

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

编辑:

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

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

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

似乎PHP会对你进行解码,所以它只应该在发送之前进行编码,而不是在收到时进行解码。