4

我有一个正在处理的项目,我需要一个.NET BCL 中不存在的数据类型 - 一个无符号 Int24。对于我正在进行的计算,int32 中的第 4 个字节,即使设置为全零,也会破坏我的结果。

编辑:我正在对仅限于 24 位的 24 位整数空间进行按位循环移位。如果在 32 位数字上以 24 位级别执行旋转,则结果非常不正确。

有谁知道可用的这种数据类型的任何第三方实现?

谢谢!

4

1 回答 1

8

实现 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.

于 2012-09-23T02:26:13.553 回答