我正在使用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;


如您所见,此结构有两个字段,datasize。这就是为什么当他们初始化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中变量初始化的更多信息。有多种不同的方案。

09-25 19:16