У меня есть объект, который имеет следующие переменные:
bool firstBool;
float firstFloat; (0.0 to 1.0)
float secondFloat (0.0 to 1.0)
int firstInt; (0 to 10,000)
Я использовал метод ToString, чтобы получить строку, которую я могу отправить по сети. Расширение Я столкнулся с проблемами с количеством данных, которые это занимает.
строка выглядит следующим образом:
"false:1.0:1.0:10000"
это 19 символов по 2 байта на каждый, так что 38 байтов
Я знаю, что могу сэкономить на этом размере, вручную сохраняя данные в 4 байта следующим образом:
A|B|B|B|B|B|B|B
C|C|C|C|C|C|C|D
D|D|D|D|D|D|D|D
D|D|D|D|D|X|X|X
A = bool(0 or 1), B = int(0 to 128), C = int(0 to 128), D = int(0 to 16384), X = Leftover bits
- Я конвертирую
float(0.0 to 1.0)
в int(0 to 128)
, так как могу перестроить их на другом конце, и точность не имеет большого значения.
Я экспериментировал с BitArray и byte [] для преобразования данных в двоичную структуру и из нее.
После некоторых экспериментов я закончил этот процесс сериализации (я знаю, что его нужно очистить и оптимизировать)
public byte[] Serialize() {
byte[] firstFloatBytes = BitConverter.GetBytes(Mathf.FloorToInt(firstFloat * 128)); //Convert the float to int from (0 to 128)
byte[] secondFloatBytes = BitConverter.GetBytes(Mathf.FloorToInt(secondFloat * 128)); //Convert the float to int from (0 to 128)
byte[] firstIntData = BitConverter.GetBytes(Mathf.FloorToInt(firstInt)); // Get the bytes for the int
BitArray data = new BitArray(32); // create the size 32 bitarray to hold all the data
int i = 0; // create the index value
data[i] = firstBool; // set the 0 bit
BitArray ffBits = new BitArray(firstFloatBytes);
for(i = 1; i < 8; i++) {
data[i] = ffBits[i-1]; // Set bits 1 to 7
}
BitArray sfBits = new BitArray(secondFloatBytes);
for(i = 8; i < 15; i++) {
data[i] = sfBits[i-8]; // Set bits 8 to 14
}
BitArray fiBits = new BitArray(firstIntData);
for(i = 15; i < 29; i++) {
data[i] = fiBits[i-15]; // Set bits 15 to 28
}
byte[] output = new byte[4]; // create a byte[] to hold the output
data.CopyTo(output,0); // Copy the bits to the byte[]
return output;
}
Получить информацию из этой структуры намного сложнее, чем получить ее в этой форме. Я полагаю, что, возможно, смогу что-то тренировать, используя побитовые операторы и битовые маски.
Это оказывается сложнее, чем я ожидал. Я думал, что было бы очень легко получить доступ к битам байта [], чтобы напрямую манипулировать данными, извлекать диапазоны битов, а затем преобразовывать обратно в значения, необходимые для перестройки объекта. Существуют ли лучшие практики для этого типа сериализации данных? Кто-нибудь знает учебник или пример ссылки, которую я мог бы прочитать?