2011-11-24 161 views
2

我有一個桌面應用程序,創建併發布大約2-3k的二進制數據到Web服務器。我已經使用HttpSendRequest來製作發佈內容,它對文本非常有用,但顯然在二進制文件中失敗。從我的研究看來,我需要base64對來自我的C++應用程序的數據進行編碼,然後在PHP中使用base64_decod e來存儲這些數據。C++ base64編碼 - PHP兼容

我已經下載了幾個設計用於在base64中進行編碼的c/C++文件,但要麼他們根本不工作,要麼編碼與PHP編碼不兼容。

我想我的問題是這樣的:

  1. 我要對這個正確的方式?有沒有更好的格式來傳輸這些數據?
  2. 是否有人知道一個簡單的類或其他C++代碼,可以幫助我以適當的格式對這些數據進行編碼?

- 更新 - 我一直在玩這個過去的一天,現在比以往更困惑。這裏的數據:

  1. 原始二進制數據:http://pastebin.com/cPWjGN3q
  2. 在C++ base64編碼後:http://pastebin.com/H4Jze96g
  3. 上傳如在PHP編碼:http://pastebin.com/TJs5WCNj
  4. I」的代碼:http://pastebin.com/MRLZrsve
  5. 在PHP解碼m使用POST數據:http://pastebin.com/L856rKmw

我不確定哪裏出了問題,但任何幫助理清這一點將不勝感激!

- UPDATE 2 - POST過程將編碼數據中的+字符更改爲空格。請參閱以下內容:

數據從C++發佈時間:http://pastebin.com/NiSE7GUe

由於通過FTP複製到服務器:http://pastebin.com/S0qjfreM

是否有合乎邏輯的理由,爲什麼後處理會改變這個角色?我更願意理解並解決實際問題,但是也許執行一個字符串替換就足以終止這個問題了?

+0

'HttpSendRequest'指http://msdn.microsoft.com/en-us/library/windows/desktop/什麼碼aa384247%28v = vs.85%29.aspx? – VolkerK

回答

0

您可以使用libb64來base64編碼您的輸入,但是base64編碼是相當標準的,所以我懷疑當您說其他庫產生與PHP不兼容的編碼時,您可能會做錯事。

您是否嘗試過寫base64編碼數據到一個文件,然後閱讀與PHP?這樣,您至少可以消除編碼不兼容問題(似乎不太可能)的機會。

編輯:

從您發佈的額外信息,它看起來像你可能不正確的URL中HttpSendRequest中的發送之前以base64編碼數據。儘管基於文本,Base64仍然使用一些在URL編碼中具有不同含義的字符,

請閱讀this以獲取編碼的解釋。我懷疑這就是爲什麼你的base64字符串中的+號在到達PHP時缺少,因爲在URL編碼中的+實際上意味着空間。

所以,你應該嘗試的URL編碼發送到HttpSendRequest中之前的字符串。我無法命名任何API來實現它,但它應該足夠簡單,可以編寫一個能夠處理所有base64字符的API。至少,你需要用%2B

好像PHP做解碼,可以更換的+的情況,所以只應neccesary發送,而不是解碼當你收到之前進行編碼。

+0

我通過POST方法比較了同一個文件的版本或通過FTP上傳。我不確定原因,但看起來+帖子在發佈時正在轉換爲空格。 – jimmy

+0

@jimmy有我的答案讀現在,我相當肯定它解釋了這個問題 – obmarg

1

Base64是明確定義的編碼機制 - 所以不應該有實現之間的不一致。如果你看到使用不同實現的一致性失敗,那麼問題就在編碼算法以外的某個地方。

您可以通過簡單的輸出轉儲到文件(甚至控制檯)進行測試。

實際上,雖然編碼方法是相對堅固的,也有一些字符,它可以根據在其中出現(URL,POST,HTML)的上下文中具有特殊的意義。除此之外,HTTP和大多數http客戶端實現不同的傳輸和內容編碼會導致更多的混淆。

可能有幫助,如果我們看到您正在使用來準備數據並調用HttpSendRequest中

+0

我貼我的HTTP代碼在這裏:http://pastebin.com/L856rKmw,並更新了我的問題,更多的細節。 – jimmy

+0

我想你會發現它的,你要發送的數據的方式 - 儘量將一些純文本(到位編碼數據以base64的),你應該看看有什麼happenning – symcbean

+0

是的,我可以成功發送標準的文本,如「FNAME =john&lname=smith&[email protected]」。如果我追加「&data = encodedstring」併發布,我似乎沒有得到完整(或正確)的數據。有更好的方法,我應該用來獲取二進制數據到我的網絡服務器? – jimmy