在应该溢出的 VB.NET 中执行 UInt32 添加的最佳方法
Best way to perform UInt32 additions in VB.NET that are supposed to overflow
在VB.NET中尝试编写ChaCha20加密算法的ARX部分时,我运行遇到了加法部分溢出异常的问题。
算法中有很多 UInt32 数的加法,加法时应该会溢出,但在我的代码的其他部分我想捕获这些异常。
处理此问题并完全避免溢出异常的一种方法是临时转换为 UInt64,然后以这种方式进行添加:
a = (a + b) mod 2^32
我不会得到任何溢出,但这不适用于 ARX 算法所需的循环位旋转,因为我现在将位推入 64 位 UInt 中的空 32 位。
这种来回转换使算法变慢,每 512 位数据块我们要经过 20 轮一组计算,因此这部分代码的性能非常重要。
在VB.NET中有没有更优雅的方法来处理这个问题?
有关该算法的更多信息:
https://en.wikipedia.org/wiki/Salsa20
感谢您分享您的见解!
您可以关闭每个编译程序集的溢出检查:
所以这意味着您可以拥有一个 DLL,您可以在其中执行所有溢出的数学运算,并且该 DLL 项目已选中此复选框(溢出检查已关闭)..
..但是你的主项目需要在溢出的情况下做数学运算,在它自己的编译设置中没有设置这个选项
这里我的 OverflowOff 项目是一个启用了“删除检查”的 DLL。一个方法已经提供了int maxvalue overflowed to int minvalue,那么使用该DLL的forms项目就溢出崩溃了,因为它自己的编译设置被设置为执行溢出检查:
在VB.NET中尝试编写ChaCha20加密算法的ARX部分时,我运行遇到了加法部分溢出异常的问题。
算法中有很多 UInt32 数的加法,加法时应该会溢出,但在我的代码的其他部分我想捕获这些异常。
处理此问题并完全避免溢出异常的一种方法是临时转换为 UInt64,然后以这种方式进行添加:
a = (a + b) mod 2^32
我不会得到任何溢出,但这不适用于 ARX 算法所需的循环位旋转,因为我现在将位推入 64 位 UInt 中的空 32 位。
这种来回转换使算法变慢,每 512 位数据块我们要经过 20 轮一组计算,因此这部分代码的性能非常重要。
在VB.NET中有没有更优雅的方法来处理这个问题?
有关该算法的更多信息: https://en.wikipedia.org/wiki/Salsa20
感谢您分享您的见解!
您可以关闭每个编译程序集的溢出检查:
所以这意味着您可以拥有一个 DLL,您可以在其中执行所有溢出的数学运算,并且该 DLL 项目已选中此复选框(溢出检查已关闭)..
..但是你的主项目需要在溢出的情况下做数学运算,在它自己的编译设置中没有设置这个选项
这里我的 OverflowOff 项目是一个启用了“删除检查”的 DLL。一个方法已经提供了int maxvalue overflowed to int minvalue,那么使用该DLL的forms项目就溢出崩溃了,因为它自己的编译设置被设置为执行溢出检查: