0

私は c# でビット パッカーを作成しようとしていますが、プリミティブ型ごとに pack 関数をオーバーロードする代わりに、動的変数を使用してより広い範囲の値を処理しようとしています。現在、GetSizeOf 関数で見つかった変数の型のみが渡されることを期待しており、それ以外が渡された場合は例外がスローされます。しかし、値を ulong にキャストするのに問題があります。int32、byte、int で試してみました。また、データは、パッキングが終了したときに、余分な 0 を含む、パッキングされたデータのバイナリ シーケンスを含む必要がある文字列です。

これを行うためのより良い方法があれば、私に知らせてください。

    public static int GetSizeOf<V>(V v)
    {
        if (v is Byte) { return sizeof(Byte) * 8; };
        if (v is SByte) { return sizeof(SByte) * 8; };
        if (v is Int16) { return sizeof(Int16) * 8; };
        if (v is UInt16) { return sizeof(UInt16) * 8; };
        if (v is Int32) { return sizeof(Int32) * 8; };
        if (v is UInt32) { return sizeof(UInt32) * 8; };
        if (v is Int64) { return sizeof(Int64) * 8; };
        if (v is UInt64) { return sizeof(UInt64) * 8; };
        throw new Exception("Unable to determine size of " + typeof(V));
    }

    public void pack<T>(T value)
    {
        if (!(value as ulong?).HasValue)
            throw new Exception("Unable to cast " + typeof(T) + " as ulong");
        ulong num = (value as ulong?).Value;
        int size = GetSizeOf(value);
        for (int i = 0; i < size; i++)
        {
            data = (num & 1) + data;
            num >>= 1;
        }
    }
4

0 に答える 0