public static void WriteUInt16(ushort source, int numberOfBits, byte[] destination, int destinationBitOffset) { if (numberOfBits == 0) { return; } #if BIGENDIAN // reorder bytes uint intSource = source; intSource = ((intSource & 0x0000ff00) >> 8) | ((intSource & 0x000000ff) << 8); source = (ushort)intSource; #endif if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)source, numberOfBits, destination, destinationBitOffset); return; } NetBitWriter.WriteByte((byte)source, 8, destination, destinationBitOffset); numberOfBits -= 8; if (numberOfBits > 0) { NetBitWriter.WriteByte((byte)(source >> 8), numberOfBits, destination, destinationBitOffset + 8); } }
/// <summary> /// Writes the specified number of bits into a byte array /// </summary> public static int WriteUInt64(ulong source, int numberOfBits, byte[] destination, int destinationBitOffset) { #if BIGENDIAN source = ((source & 0xff00000000000000L) >> 56) | ((source & 0x00ff000000000000L) >> 40) | ((source & 0x0000ff0000000000L) >> 24) | ((source & 0x000000ff00000000L) >> 8) | ((source & 0x00000000ff000000L) << 8) | ((source & 0x0000000000ff0000L) << 24) | ((source & 0x000000000000ff00L) << 40) | ((source & 0x00000000000000ffL) << 56); #endif int returnValue = destinationBitOffset + numberOfBits; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)source, numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)source, 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 8), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 8), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 16), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 16), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 24), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 24), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 32), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 32), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 40), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 40), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 48), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 48), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; if (numberOfBits <= 8) { NetBitWriter.WriteByte((byte)(source >> 56), numberOfBits, destination, destinationBitOffset); return(returnValue); } NetBitWriter.WriteByte((byte)(source >> 56), 8, destination, destinationBitOffset); destinationBitOffset += 8; numberOfBits -= 8; return(returnValue); }