Я работаю над серверным проектом на C #, и после получения TCP-сообщения оно анализируется и сохраняется в байте [] точного размера. (Не буфер фиксированной длины, а байт [] абсолютной длины, в котором хранятся все данные.)
Теперь для чтения этого байта [] я буду создавать некоторые функции-оболочки (также для совместимости), это сигнатуры всех необходимых мне функций:
public byte ReadByte();
public sbyte ReadSByte();
public short ReadShort();
public ushort ReadUShort();
public int ReadInt();
public uint ReadUInt();
public float ReadFloat();
public double ReadDouble();
public string ReadChars(int length);
public string ReadString();
Строка является завершенной \ 0 строкой и, вероятно, закодирована в ASCII или UTF-8, но я не могу сказать это точно, так как я не пишу клиент.
Данные существуют:
byte[] _data;
int _offset;
Теперь я могу написать все эти функции вручную, например:
public byte ReadByte()
{
return _data[_offset++];
}
public sbyte ReadSByte()
{
byte r = _data[_offset++];
if (r >= 128) return (sbyte)(r - 256);
else return (sbyte)r;
}
public short ReadShort()
{
byte b1 = _data[_offset++];
byte b2 = _data[_offset++];
if (b1 >= 128) return (short)(b1 * 256 + b2 - 65536);
else return (short)(b1 * 256 + b2);
}
public short ReadUShort()
{
byte b1 = _data[_offset++];
return (short)(b1 * 256 + _data[_offset++]);
}
Но мне интересно, есть ли более быстрый способ, не исключающий использования небезопасного кода, поскольку это кажется слишком дорогим для простой обработки.