【发布时间】:2013-09-25 04:59:06
【问题描述】:
在尝试在 GCC/Linux C++ 中复制 PHP 的 bin2hex($s) 和 pack('H*',$s)(在 PHP 5.4.3+ 中也称为 hex2bin($s))时,我似乎已经弄清楚了,只是它出于某种奇怪的原因而删除了标点符号。你能弄清楚我在 hex2bin() 函数中可能做错了什么吗?我将 PHP 的 bin2hex() 与我的进行了比较,它似乎在那里正常工作,所以问题出在 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
【问题讨论】:
-
那是……相当令人不安的代码。另外:十六进制是 encoding not encryption。我希望你知道其中的区别。 (!?!?)。 (我冒昧地将其重写为 C++ 实现。请参阅我的答案)
-
你期待什么 n2 = atoi(cBuff2);当输入结束时到达“e”时该怎么办?它将返回 0,n 将是 2*16+0 = 32,这是一个空格。我认为您不能使用 atoi - 您需要可以接受基数 af 16 的东西。 strtol 可能会起作用。可能还有 sscanf。
-
@sehe 在 Twitter 上查找我,让我们通过电子邮件联系。在 20 年没有接触 C++ 之后,我正在重新审视它。您的反馈是有保证的,任何有关我如何在该平台上更好地编码的详细反馈都将受到赞赏。例如,我什至没有关注内存泄漏,因为我不知道如何正确地释放东西。
-
@sehe 顺便说一句,这篇文章被用作我正在研究的一些跨平台加密的一部分,我忘记更改函数名称以反映你是正确的,它是编码。
标签: c++ string hex binary-data printf