输入Safe Vs松散键入 - GO Vs C.

ove*_*nge 2 c casting go

在C中,以下是嗅探器代码,

void Handle_IP(char *buf)
{
    struct iphdr *ip_hdr; // declaring pointer of type ip header 

    struct in_addr in; // declaring a structure which holds ip address 

    FILE *fp;
    int ctl, len;

    /* In the following statement we're adjusting the offset so that
       ip pointer can point to correct location */

    ip_hdr = (struct iphdr *)(buf + 14);
    ....
}
Run Code Online (Sandbox Code Playgroud)

哪条线,

ip_hdr = (struct iphdr *)(buf + 14)char *类型铸造的struct iphdr *.

GO是一种类型安全的语言,不允许这种类型的转换.void *除了interface结构类型之外,Go没有

如何在GO中处理这样的代码?

Jör*_*tag 6

让我们从不同的角度来看待这个问题:在C中做类型转换是做什么的?

嗯,从某种意义上说,它什么都不做!它只需要在内存中的某个点上采用一些位模式,并盲目地假设这个特定的位模式实际上代表了某种类型的值.但是没有对此进行验证,没有任何解析.这就是问题所在.

但是,我已经使用了上述问题的解决方案:解析.而不是盲目地假设内存中的某些随机位模式是C编译器为某种类型的值生成的相同位模式,我们实际上看一下位模式,检查它是否符合位模式的规则构造该数据类型,并根据这些规则将位模式解构为其组成部分.

换句话说:我们编写一个解析器.

请注意,这不是Go特有的.即使在C中也是一个好主意.实际上,您发布的代码至少有三种,也许是四种不同的方式:

  • a char不是8位宽的平台
  • 对准
  • 填充
  • 字节序

AFAIK,已有现成的IP,UDP和TCP解析器,可以使用或学习.此外,来自Alan Kay的Viewpoints Research Institute的当前系统有一个非常酷的TCP/IP堆栈,只需120行左右,非常容易阅读.(实际上,解析器的源代码实际上只包含从RFC剪切并粘贴的ASCII图.)