C ++ base64 кодировка - совместимая с PHP - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть настольное приложение, которое создает и отправляет около 2-3 тыс. Двоичных данных на веб-сервер. Я обработал часть публикации, используя HttpSendRequest, которая прекрасно работает с текстом, но, очевидно, не работает с двоичным файлом. Из моих исследований видно, что мне нужно base64 кодировать данные из моего приложения на c ++, а затем использовать base64_decod e в PHP для хранения этих данных.

Я скачал несколько файлов c / c ++, предназначенных для кодирования в base64, но они либо просто не работают, либо кодировка несовместима с кодировкой PHP.

Я думаю, мои вопросы таковы:

  1. Правильно ли я поступаю? Есть ли лучший формат для передачи этих данных?
  2. Кто-нибудь знает простой класс или другой код на С ++, который может помочь мне кодировать эти данные в правильном формате?

- ОБНОВЛЕНИЕ - Я играл с этим в течение последнего дня, и теперь я запутался как никогда. Вот данные:

  1. Исходные двоичные данные: http://pastebin.com/cPWjGN3q
  2. После кодирования base64 в C ++: 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

Есть ли логическая причина, по которой пост-процесс изменит этот символ? Я бы предпочел понять и решить реальную проблему, но, возможно, выполнения замены строки будет достаточно, чтобы в конце концов обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Base64 - это четко определенный механизм кодирования, поэтому между реализациями не должно быть несоответствий. Если вы видите постоянные сбои при использовании разных реализаций, то проблема не в алгоритме кодирования, а в другом.

Вы можете проверить это, просто сбросив вывод в файл (или даже консоль).

Действительно, хотя метод кодирования является относительно надежным, есть некоторые символы, которые могут иметь особое значение в зависимости от контекста, в котором они появляются (URL, POST, Html). Добавьте к этому тот факт, что HTTP и большинство http-клиентов реализуют разные кодировки передачи и содержимого, могут вызвать дополнительную путаницу.

Может помочь, если мы увидим, какой код вы используете для подготовки данных, и вызовите HttpSendRequest

0 голосов
/ 24 ноября 2011

Вы можете использовать libb64 для кодирования base64 вашего ввода, однако кодировка base64 довольно стандартна, поэтому я подозреваю, что вы, возможно, делаете что-то не так, когда говорите, что другие библиотеки производят кодировки, несовместимые с PHP.

Вы пытались записать данные в кодировке base64 в файл, а затем прочитать их с помощью PHP?Таким образом, вы можете, по крайней мере, исключить (на первый взгляд маловероятный) шанс несовместимости кодирования.

РЕДАКТИРОВАТЬ:

Из дополнительной информации, которую вы разместили, похоже, что вы не правильно кодируете URLданные base64 перед отправкой в ​​HttpSendRequest.Base64, хотя и основанный на тексте, все еще использует некоторые символы, которые имеют другое значение в кодировке URL,

Прочитайте this для объяснения кодировки.Я подозреваю, что именно поэтому + в вашей базовой строке 64 отсутствуют, когда они поступают в PHP, так как кодировка + в URL фактически означает пробел.

Итак, вы должны попробовать кодировать строку URL перед отправкой вHttpSendRequest.Я не могу назвать какие-либо API, чтобы сделать это на макушке, но это должно быть достаточно просто, чтобы написать тот, который заботится обо всех символах base64.По крайней мере, вам нужно заменить экземпляры + на %2B

Кажется, что PHP выполняет расшифровку для вас, так что перед отправкой необходимо только кодировать, скореечем декодирование при получении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...