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

我尝试过:

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);


提前致谢

最佳答案

在C和C ++中,当您有类似

char name[]="John Smith";


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

当你有类似的代码
    char * strptr = foo();
    char str [] = strptr;

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

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

所以

char name[] = "John Smith";


被允许。

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


不被允许。

使用memcpy

因此,您可以使用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:user:427390)

关于c++ - 传递参数并将其转换为十六进制时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14290496/

10-12 02:54
查看更多