最近,我一直在尝试从捕获的DHCP数据包中保存主机名列表。我发现,每个 DHCP主机名(选项12)都应该在 RFC 1035 中定义。因此,如果我理解正确,主机名应该用7位ASCII编码,并有其他限制,如: - 名称不应以数字开头,并且应省略一些禁用字符。
我在数据包中遇到的几乎所有设备都满足此约束,但不支持Windows设备(供应商ID MSFT 5.0 )。恕我直言Windows DHCP客户端获取计算机(移动)名称并填写主机名选项。
当计算机名称设置为“Lukáš-PC”时,会出现问题。 Wireshark将此主机名显示为 Luk \ 240 \ 347-PC 。 (240和347是八进制数)。为了亲眼看看,我用printf(“%hhu”,c)(C语言)打包了数据包。
á = 160
š = 231
恕我直言我认为这是简单的char变量溢出。我尝试从溢出值中推导出原始值,但我没有发现字符和已知编码之间的任何关系。所以我的问题是:
有没有办法将这些值转换回原始值? 如果是,那么什么是原始字符编码,何时发生溢出?
感谢。
答案 0 :(得分:1)
默认char
通常是签名的,并在传递给可变参数函数时扩展到int
。要确保未经签名打印,请使用printf("%hhu", c)
或printf("%d", (unsigned char)c);
。
无法知道正确的编码,因为它取决于每个系统的设置。
请注意,任何符合要求的系统必须根据RFC 3490对名称进行编码,但Windows似乎喜欢违反标准。
答案 1 :(得分:0)
您正在使用code page 852 (Latin-2 - Central European languages)编码的字符á和š。
不幸的是,没有简单的方法可以找出仅通过查看DHCP请求而使用的编码。原则上,DHCP客户端可以使用它想要的任何代码页。如果您在私有/受控网络中工作,那么可以安全地假设所有客户端使用相同的代码页并使用该特定代码页显式编码字符串。