c - 类型安全与松散类型 - GO 与 C

标签 c go casting

在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);
    ....
}

哪里行,

ip_hdr = (struct iphdr *)(buf + 14)char *类型转换为 struct iphdr * .

GO 作为一种类型安全的语言,不允许这样的类型转换。 Go 没有 void *除了 interface遵循结构类型

如何在 GO 中处理此类代码?

最佳答案

让我们换个角度来看这个问题:类型转换在 C 语言中有什么作用?

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

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

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

请注意,这并非特定于 Go。即使在 C 中也是一个好主意。事实上,您发布的代码至少有三种,也许四种不同的方式被破坏:

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

据我所知,已经有现成的用 Go 编写的 IP、UDP 和 TCP 解析器,您可以使用或学习它们。此外,Alan Kay 的 Viewpoints Research Institute 的当前系统有一个非常酷的 TCP/IP 堆栈,仅用 120 行左右编写,非常易于阅读。 (事实上​​ ,解析器的源代码实际上只是由从 RFC 剪切和粘贴的 ASCII 图组成。)

关于c - 类型安全与松散类型 - GO 与 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42192207/

相关文章:

c - 函数 ‘strrev’ 的隐式声明

go - 带参数的 Dialogflow 响应

unit-testing - 在 Go 中测试依赖于动态 URL 的处理函数

c++ - 转换为未知类型

java - 使用 & 的奇怪 Java 转换语法

c++ - 获取STL vector C++的地址

objective-c - 基于浏览器的 C 和 Objective-C 教程

c - 通过 UART 使用 ASCII

c - 无法从函数返回 char 指针

Goroutines 通信槽 channel 只工作一次