struct {
uint16 msg_length;
uint8 msg_type;
ProtocolVersion version;
uint16 cipher_spec_length;
uint16 session_id_length;
uint16 challenge_length;
V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length];
opaque session_id[V2ClientHello.session_id_length];
opaque challenge[V2ClientHello.challenge_length;
} V2ClientHello;
是否可以执行与上述类似的操作(http://tools.ietf.org/html/rfc5246)?如果是这样,我如何在C内编码?
在结构中更具体这一行:
V2CipherSpec cipher_specs [V2ClientHello.cipher_spec_length];
用途:
V2ClientHello.cipher_spec_length
这是在同一个结构中定义的,用于设置数组的长度。
答案 0 :(得分:4)
C不支持动态大小的数组。为了实现目标,可以使用类型为V2CipherSpec
的指针作为结构变量,并使用V2ClientHello.cipher_spec_length
值在稍后阶段分配内存。
答案 1 :(得分:3)
绝对不是。 C没有动态大小的数组。相反,我们可以依靠这样的技巧:
struct {
uint16 msg_length;
uint8 msg_type;
ProtocolVersion version;
uint16 cipher_spec_length;
uint16 session_id_length;
uint16 challenge_length;
char extra[0]; // or 1 if your compiler hates this
} V2ClientHello;
然后,不要直接创建此结构的实例,而是通过malloc():
struct V2ClientHello* hello = malloc(sizeof(V2ClientHello) +
len1*sizeof(V2CipherSpec) + len2 + len3);
现在您拥有了所需大小的动态分配结构。您可以使用访问器函数来获取“额外”字段:
V2CipherSpec* get_spec(V2ClientHello* hello, int idx) {
assert(idx < hello->cipher_spec_length);
return ((V2CipherSpec*)&hello->extra)[idx];
}
当然,你可以在一个创建例程中包含malloc()调用,该例程获取所有三个动态部分的大小,并在一个地方完成所有操作以确保健壮性。
答案 2 :(得分:0)
RFC中显示的代码是伪代码,您无法如图所示实现它。
一旦知道了值,您需要根据V2ClientHello.cipher_spec_length
和其他长度规范字段手动分配这些数组。
答案 3 :(得分:0)
&#34; V2ClientHello.cipher_spec_length&#34;的值在编译时不可用。您不能在运行时指定数组的大小,而是使用:
V2CipherSpec * cipher_specs;
在struct中并使用malloc或calloc在运行时分配一块内存。
V2ClientHello.cipher_specs =(V2CipherSpec *)malloc(V2ClientHello.cipher_spec_length);