При попытке дублировать PHP bin2hex($s)
и pack('H*',$s)
(aka hex2bin($s)
в PHP 5.4.3+) в GCC/Linux C++ я, похоже, понял это, за исключением того, что он помечает пунктуацию по какой-то странной причине. Можете ли вы выяснить, что я могу сделать неправильно в функции hex2bin()? Я сравнивал bin2hex() с моим и, похоже, работает там правильно, поэтому проблема в hex2bin().Отсутствие пунктуации из C++ hex2bin
#include <strings.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
string bin2hex(string s) {
int nLen = s.length();
string sOut;
char cBuff[2];
for (int i = 0; i < nLen; i++) {
sprintf(cBuff,"%.2x",s[i]);
sOut.append(cBuff);
cBuff[0] = '\0';
}
return sOut;
}
string hex2bin(string s) {
int nLen = s.length();
string sOut;
char cBuff1[2];
char cBuff2[2];
char cBuff[1];
int n,n1,n2;
for (int i = 0; i <= nLen; i+=2) {
sprintf(cBuff1,"%c",s[i]);
sprintf(cBuff2,"%c",s[i+1]);
n1 = atoi(cBuff1);
n2 = atoi(cBuff2);
n = (n1 * 16) + n2;
sprintf(cBuff,"%c",n);
sOut.append(cBuff);
cBuff[0] = '\0';
cBuff1[0] = '\0';
cBuff2[0] = '\0';
}
return sOut;
}
int main() {
string s;
string sResult;
s = "This is a 123 test.";
sResult = bin2hex(s);
printf("ENCODED: %s\n",sResult.c_str());
sResult = hex2bin(sResult);
printf("UNENCODED: %s\n",sResult.c_str());
return 1;
}
Срабатывает:
ENCODED: 5468697320697320612031323320746573742e
UNENCODED: This is a 123 test
Это ... довольно тревожный код. Также: hex is _encoding_ *** not *** _encryption_. Надеюсь, вы знаете разницу. (!?!?). (Я взял на себя смелость переписать это в реализацию на C++. См. Мой ответ) – sehe
Что вы ожидали от n2 = atoi (cBuff2); делать, когда это доходит до этого «e» в конце вашего ввода? Он вернет 0 и n будет 2 * 16 + 0 = 32, которое является пространством. Я не думаю, что вы можете использовать atoi - вам нужно что-то, что может принять radix af 16. strtol, вероятно, сработает. И, возможно, sscanf. –
@sehe Посмотрите меня на Twitter и давайте подключаться по электронной почте. Я пересматриваю C++, не касаясь его в течение 20 лет. Ваша обратная связь оправдана, и любые подробные отзывы о том, как я могу лучше кода на этой платформе, оцениваются. Например, я даже не сосредоточился на утечке памяти, потому что я не знаю, как правильно освободить материал. – Volomike