У меня есть массив данных из байтов, однако этот массив может содержать любое беззнаковое число (byte/ushort/uint/ulong) в виде байтов.Как правило, получение разных числовых типов данных из массива байтов
Проблема заключается в том, что данные снова возвращаются в требуемый тип: я хочу, чтобы ответственность за преобразование данных обратно в требуемый тип данных из класса обработчика, а не за запрос, запрашивающий данные снова (который мог бы преобразовать возвращенный байтовый массив, представляющий значение).
Кроме того, реф или из переменных, хотя одно из решений, являются нервотрепки в качестве членов я присваивающих не обязательно типа я возвращающегося (читай явные перечислений):
public enum SomeEnum : ulong
{
// ...
}
Функции у меня есть на данный момент являются:
/// <summary>
/// Get data (byte)
/// </summary>
public byte GetDataByte(byte dataIndex)
{
return this.Data[dataIndex];
}
/// <summary>
/// Get data (ushort)
/// </summary>
public ushort GetDataUshort(byte startingDataIndex)
{
ushort output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(ushort); i++)
{
output |= (ushort)(this.Data[i] << (i * 8));
}
return output;
}
/// <summary>
/// Get data (uint)
/// </summary>
public uint GetDataUint(byte startingDataIndex)
{
uint output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(uint); i++)
{
output |= ((uint)this.Data[i] << (i * 8));
}
return output;
}
/// <summary>
/// Get data (ulong)
/// </summary>
public ulong GetDataUlong(byte startingDataIndex)
{
ulong output = 0;
for (byte i = startingDataIndex; i < this.Data.Length && i < sizeof(ulong); i++)
{
output |= ((ulong)this.Data[i] << (i * 8));
}
return output;
}
Может ли это быть объединены в одну функцию, и как бы я идти о выполнении этого? Как
SomeEnum member = (SomeEnum)GetData<ulong>(dataIndex);
но
GetData<byte>(0);
public T GetData<T>(byte startingDataIndex) // T would be byte during runtime
{
return this.Data[dataIndex]; // Compiler: Er, T? Byte? what?
}
или
/// <summary>
/// Get data (T)
/// </summary>
public T GetData<T>(byte startingDataIndex)
{
T output = 0; // Compiler: derp, this isn't an integer.
for (byte i = startingDataIndex; i < this.Data.Length && i < System.Runtime.InteropServices.Marshal.SizeOf(typeof(T)); i++)
{
output |= (T)(this.Data[i] << (i * 8)); // Compiler: nor is this!
}
return output;
}
Или я действительно лучше оставить как отдельные функции и поддерживать их все?
Мне нравится этот подход к дизайну, но он не будет компилироваться как 'ReadInt (startIndex);' будет возвращать int (не T) и 'ReadByte (startIndex);' возвратит байт (а не T). Вы не можете наложить на T либо потому, что компилятор не знал, как преобразовать int или byte в T. – kjhf
Подождите, работает двойной кастинг (T) (объект). :) – kjhf
да, извините, что я обновлю код. Я только что взорвал что-то с головы. –