ReadInt32 vs. ReadUInt32

本文关键字:ReadUInt32 vs ReadInt32 | 更新日期: 2023-09-27 18:07:31

当我注意到一些奇怪的事情时,我正在摆弄IP数据包'解析器'。

解析IP地址时,在c#中

private uint srcAddress; 
// stuff
srcAddress = (uint)(binaryReader.ReadInt32());

可以达到这个目的,所以你会认为这个VB。净equivallent

Private srcAddress As UInteger
'' stuff
srcAddress = CUInt(binaryReader.ReadInt32())

也可以。它不是。:

srcAddress = reader.ReadUInt32()
然而。

花了一些时间去发现,但我发现了什么——如果有的话?为什么?

ReadInt32 vs. ReadUInt32

VB。NET在默认情况下做了一些c#在默认情况下没有做的事情。它总是检查数值溢出。并且将在您的代码中触发,最后一位为1而不是0的IP地址将产生一个负数,并且不能转换为UInteger。一种只能存储32位正数的数据类型。

c#也有这个选项,你必须在代码中显式地使用checked关键字。或者使用与VB相同的选项。. NET项目默认开启:项目+属性,构建选项卡,高级,勾选"检查算术溢出/下溢"复选框。在VB中有相同的选项。. NET项目名为"移除整数溢出检查",默认为关闭。

请注意这些默认值是如何影响语言的语法的。在c#中,可以编写强制类型转换,将值转换为不兼容的值类型。在VB中不需要。NET,运行时检查使您远离麻烦。有很坏的一种麻烦,溢出会产生剧烈的不良后果。但在你的情况下,这种情况发生了,IP地址实际上是一个无符号数。

请记住ip地址的另一个奇怪之处,套接字最初是在由LSD和大端处理器驱动的Unix机器上发明的。通常必须使用IPAddress.NetworkToHostOrder()以正确的顺序获取地址。它只具有以有符号整数类型作为参数的重载。所以使用ReadInt32()实际上是正确的,假设它是一个IPv4地址,你直接传递给NetworkToHostOrder()。不用担心溢出