private static void WriteBlock(byte[] values, NetworkWriter writer, int blockIndex) { var bitesSkipped = 0; var fullBlockMask = new FullBlockMask(); var orderedValues = new List <byte>(); for (var i = 0; i < 32; i++) { fullBlockMask.integer <<= 1; if ((blockValuesMask & highestBitInInt >> i) == 0) { bitesSkipped++; continue; } var valueIndex = blockIndex * valuesPerBlock + (i - bitesSkipped); if (valueIndex >= values.Length) { continue; } if (values[valueIndex] != 0) { fullBlockMask.integer |= 1; orderedValues.Add(values[valueIndex]); } } var lastIndex = 0; for (var i = 0; i < blockPartsCount; i++) { if (fullBlockMask[i] != 0) { lastIndex = i; } } fullBlockMask.integer |= fullBlockHeader; fullBlockMask[lastIndex] = (byte)(fullBlockMask[lastIndex] | highestBitInByte); for (var i = 0; i <= lastIndex; i++) { var(headerMask, _) = GetMask(i); if ((fullBlockMask[i] & (~headerMask)) != 0) { writer.Write(fullBlockMask[i]); } } foreach (var value in orderedValues) { writer.Write(value); } }
private static void ReadBlock(ref byte[] values, NetworkReader reader, int blockIndex) { var fullBlockMask = new FullBlockMask(); var maskIndex = 0; while (true) { var blockBytes = reader.ReadByte(); uint mask, xor; do { (mask, xor) = GetMask(maskIndex++); }while ((blockBytes & mask ^ xor) != 0); fullBlockMask[maskIndex - 1] = blockBytes; if ((blockBytes & highestBitInByte) != 0) { break; } } var bitesSkipped = 0; for (var i = 0; i < 32; i++) { if ((blockValuesMask & highestBitInInt >> i) == 0) { bitesSkipped++; continue; } if ((fullBlockMask.integer & highestBitInInt >> i) != 0) { var valueIndex = (blockIndex * valuesPerBlock) + i - bitesSkipped; ResizeOrInitIfNeeded(ref values, valueIndex); values[valueIndex] = reader.ReadByte(); } } }