私は 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;
}
}