0

如何通过参数插入文本并自动将其转换为十六进制?

我试过:

unsigned char aesKey[32] = argv[1];

但得到错误

输出将是这样的:

unsigned char aesKey[32] = {
    0x53, 0x28, 0x40, 0x6e, 0x2f, 0x64, 0x63, 0x5d, 0x2d, 0x61, 0x77, 0x40, 0x76, 0x71, 0x77, 0x28, 
    0x74, 0x61, 0x7d, 0x66, 0x61, 0x73, 0x3b, 0x5d, 0x66, 0x6d, 0x3c, 0x3f, 0x7b, 0x66, 0x72, 0x36
};

unsigned char *buf;

aes256_context ctx;
aes256_init(&ctx, aesKey);

for (unsigned long i = 0; i < lSize/16; i++) {
    buf = text + (i * 16);
    aes256_encrypt_ecb(&ctx, buf);
}

aes256_done(&ctx);

提前致谢

4

3 回答 3

1

在 C 和 C++ 中,当你有类似的代码时

char name[]="John Smith";

编译器在编译时知道该 char 数组的大小以及所有值。因此它可以在堆栈帧上分配它并为其分配值。

当你有像 char * strptr = foo(); 这样的代码时 字符 str[] = strptr;

编译器不知道 strptr 指向的字符串的大小和值是多少。这就是为什么在 C/C++ 中不允许这样做。

换句话说,只能将字符串文字分配给 char 数组,而且也只能在声明时分配。

所以

char name[] = "John Smith";

被允许。

char name[32];
name = "John Smith";

不被允许。

使用内存

所以你可以使用 memcpy。(或使用其他人提到的 c++ 替代方案)

unsigned char *aesKey;
size_t len = (strlen(argv[1])+1)*sizeof(unsigned char);
aesKey = malloc(len);
memcpy(aesKey, argv[1], len);

旧的解决方案

(这里是我之前的回答,上面的回答比较好)所以需要用到strncpy。

unsigned char aesKey[32];
strncpy((char *) aesKey, argv[1], 32);

请注意,例程是 strncpy 而不是 strcpy。strcpy 是不安全的。(感谢 PRouleau 的 arg 修复)

如果 strncpy 在 Visual Studio 中不可用,那么您可能必须尝试 strcpy_s(感谢 Google:用户:427390)

于 2013-01-12T05:29:23.300 回答
0

在 C/C++ 中,编译器不会自动操作数组。您必须指定如何复制它们。

好的旧方法是使用 memcpy()。更现代的方法是使用 std::copy()。在任何情况下,您都必须在复制到 aesKey 之前验证 argv[1] 的长度。

要转换为十六进制,您可能必须将“AAEE3311”(最多 2*32 个字符)之类的字符串转换为字节。您应该使用 std::istringstream 并按位置填充您的 aesKey 位置。

前任:

std::istringstream Input(argv[1]);
Input >> std::hex >> aesKey[0];
于 2013-01-12T05:36:14.147 回答
0

我会想象一个程序被称为如下 -

myprog 0x53 0x28 0x40 0x6e 0x2f 0x64 0x63

在程序内部,我将有一个循环将参数分配给数组 -

const int size = 32;
unsigned char aesKey[size];
char* p;

for (int i = 1; i < argc || i < size; ++i)
{
    aesKey[i] = (unsigned char)strtol(argv[i], &p, 16);
}
于 2013-01-12T06:50:18.257 回答