我正在使用gnutls AES加密,这就是我的代码
const gnutls_datum_t * key;
*key = (const char*)"tZOVP7o/u2vQB+4B/0O0ZqLWvydBni8qWnUTFMU5yx4=";
当编译GCC时说
error: no match for ‘operator=’ (operand types are ‘const gnutls_datum_t’ and ‘const char*'
然后我来看了gnutls文档,看到了这样的实现
const gnutls_datum_t key = {
(void *)
"\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe"
"\xde\x0f\x3b\x48\x2c\xd9\xae\xa9\x43\x4d",
20
};
现在我的问题是:
=
和={ }
有什么区别,为什么他在后面加上20,是因为字符串从十六进制转换为bin后的大小是多少?我什么时候应该使用像
(void*)
这样的类型转换,并且如果没有(void *)
,上述键字符串怎么了?它将被编译为const char *吗? 最佳答案
快速的Google搜索发现this link的内部结构为gnutls_datum_t
:
typedef struct
{
unsigned char *data;
unsigned int size;
} gnutls_datum_t;
如您所见,此结构有两个字段,
data
和size
。这就是为什么当他们初始化key
时,他们传递两个变量,中间用逗号分隔。第一个设置
data
的值为:(void *)
"\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe"
"\xde\x0f\x3b\x48\x2c\xd9\xae\xa9\x43\x4d"
第二个设置
size
的值为:20
关于您的其他问题:
您可以使用列表初始化器here阅读有关C中变量初始化的更多信息。有多种不同的方案。