我正在尝试在 c# 中编写一个位打包程序,而不是为每个原始类型重载 pack 函数,而是尝试使用动态变量来处理更广泛的值。目前我只期望在 GetSizeOf 函数中找到的变量类型被传递,如果传递了其他任何东西,就会抛出异常。但是我在将价值转化为乌龙时遇到了麻烦。我已经用 int32、byte 和 int 试过了。此外,data 是一个字符串,在完成打包后应该包含打包数据的二进制序列,包括多余的 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;
}
}