我正在尝试测试某些内容,我需要假设输入来自使用TCP的客户端,并且数据是缓冲区或字节数组。
所以这是我的尝试:
unsigned char buf [] = {99,249,117,130,110,227,171,204,30,201, 225,130,203,206,74,88,94,12,223,172,60,12,173,26,145, 163,112,124,99,239,188,98,103,85,163,135,125,140,186, 220,207,35,185,14,22,58,36,239,124,107,29,27,44,246,165 };
所以假设这是来自客户端。我想测试一下来处理它:
xor256.Decrypt(buf, result, sizeof(buf));
但是Decrypt
是:
void XOR256::Decrypt(char const* in, char* result, size_t n)
那么我该如何解决这个问题呢?
问题:
无法使用左值const char *
unsigned char[55]
类型的变量
我对此感到困惑。我想获得结果,但此函数不返回任何内容。但它将数据指向result
。那么如何获取数据呢?
我是C ++的新手
int main(int argc, const char * argv[])
{
CXOR256Stream xor256;
char *nkey = new char[256];
int a = 111;
int b = 222;
memset(nkey, 0x00, 256);
sprintf((char*)nkey, "%.5d_XXX%.5d_XXX_%.5d", (a+10), (b+10), (a+b));
unsigned char s[] = { 99, 249, 117, 130, 110, 227, 171, 204, 30, 201, 225, 130, 203, 206, 74, 88, 94, 12, 223, 172, 60, 12, 173, 26, 145, 163, 112, 124, 99, 239, 188, 98, 103, 85, 163, 135, 125, 140, 186, 220, 207, 35, 185, 14, 22, 58, 36, 239, 124, 107, 29, 27, 44, 246, 165 };
const char* buf = s; // error here
char result[50];
xor256.Initialize(nkey, 256, 2);
xor256.Decrypt(buf, result, sizeof(buf));
// no error here but I'm confused on getting the data from decrypt so is this right?
cout << result << endl;
return 0;
}
答案 0 :(得分:3)
老实说,这是一个你需要学习更好的问题。我并不打算听起来很刺耳,所以请不要这样做。通过实例学习当然是可以理解的,许多人,包括我自己,都学得很好。我可以制作一个(例子),但你不能把它作为一个&#34;好吧,这个问题就解决了,因为真正的问题正在学习语言(和相信我,语言很棒,所以值得痛苦。)
无论如何,你的代码。假设您不希望随后的内存泄漏(不需要动态分配),最简单的答案是:
int main(int argc, const char * argv[])
{
CXOR256Stream xor256;
char nkey[256] = {0};
int a = 111;
int b = 222;
sprintf(nkey, "%.5d_XXX%.5d_XXX_%.5d", (a+10), (b+10), (a+b));
unsigned char s[] =
{
99, 249, 117, 130, 110, 227, 171, 204, 30, 201, 225,
130, 203, 206, 74, 88, 94, 12, 223, 172, 60, 12, 173,
26, 145, 163, 112, 124, 99, 239, 188, 98, 103, 85, 163,
135, 125, 140, 186, 220, 207, 35, 185, 14, 22, 58, 36,
239, 124, 107, 29, 27, 44, 246, 165
};
char result[sizeof(s)] = {0};
xor256.Initialize(nkey, sizeof(nkey), 2);
xor256.Decrypt(reinterpret_cast<char const*>(s), result, sizeof(s));
cout << result << endl;
return 0;
}
值得注意的是:
sizeof(buf)
对于解密的size参数来说是错误的。这是指针的大小,你需要密码文本中 bytes 的数量。char
数据,您将地址传递给unsigned char
数据。在这种情况下,reinterpret_cast<>
是可行的。这不是你在C ++中轻易抛出的东西,所以不要习惯它。也就是说,如果我理解您尝试调用的代码,那么缓冲区大小可能需要工作。我认为您正在使用的XOR256Stream算法包应记录所需的精确缓冲区大小。我怀疑长度为50的结果缓冲区不够,但这不是你问题的根源。这至少应该让你开始。祝你好运。
答案 1 :(得分:2)
你只需要一个类型转换。
const char* buf = (const char*) s;
对于那些超过127的人,你会得到负数。在char
和unsigned char
之间转换不会造成任何损失,所以只要你在其他地方正确处理它就没问题。编辑:但是,你必须要小心,因为转换可能是不可预测的,除非你要char
然后直接回来。