我有一个正在处理的项目,我需要一个.NET BCL 中不存在的数据类型 - 一个无符号 Int24。对于我正在进行的计算,int32 中的第 4 个字节,即使设置为全零,也会破坏我的结果。
编辑:我正在对仅限于 24 位的 24 位整数空间进行按位循环移位。如果在 32 位数字上以 24 位级别执行旋转,则结果非常不正确。
有谁知道可用的这种数据类型的任何第三方实现?
谢谢!
实现 Int24 并不难(老实说!)。但是我们需要更多地了解为什么需要实施它。@nneonneo 想知道您是否正在尝试与使用 24 位整数的本机库进行交互。如果是这种情况,那么您可以通过执行以下操作来完成:
[StructLayout(LayoutKind.Sequential)]
public struct UInt24 {
private Byte _b0;
private Byte _b1;
private Byte _b2;
public UInt24(UInt32 value) {
_b0 = (byte)( (value ) & 0xFF );
_b1 = (byte)( (value >> 8) & 0xFF );
_b2 = (byte)( (value >> 16) & 0xFF );
}
public unsafe Byte* Byte0 { get { return &_b0; } }
public UInt32 Value { get { return _b0 | ( _b1 << 8 ) | ( _b2 << 16 ); } }
}
// Usage:
[DllImport("foo.dll")]
public static unsafe void SomeImportedFunction(byte* uint24Value);
UInt24 uint24 = new UInt24( 123 );
SomeImportedFunction( uint24.Byte0 );
Modifying the class for big-endian or signed Int24 is an exercise left up to the reader.