public static int WriteUInt64(ref byte[] buffer, int offset, ulong value) { var startOffset = offset; ulong num1 = value, num2, num3, num4, num5, div; if (num1 < 10000) { if (num1 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); goto L1; } if (num1 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 2); goto L2; } if (num1 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 3); goto L3; } BinaryUtil.EnsureCapacity(ref buffer, offset, 4); goto L4; } else { num2 = num1 / 10000; num1 -= num2 * 10000; if (num2 < 10000) { if (num2 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 5); goto L5; } if (num2 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 6); goto L6; } if (num2 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 7); goto L7; } BinaryUtil.EnsureCapacity(ref buffer, offset, 8); goto L8; } else { num3 = num2 / 10000; num2 -= num3 * 10000; if (num3 < 10000) { if (num3 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 9); goto L9; } if (num3 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 10); goto L10; } if (num3 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 11); goto L11; } BinaryUtil.EnsureCapacity(ref buffer, offset, 12); goto L12; } else { num4 = num3 / 10000; num3 -= num4 * 10000; if (num4 < 10000) { if (num4 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 13); goto L13; } if (num4 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 14); goto L14; } if (num4 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 15); goto L15; } BinaryUtil.EnsureCapacity(ref buffer, offset, 16); goto L16; } else { num5 = num4 / 10000; num4 -= num5 * 10000; if (num5 < 10000) { if (num5 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 17); goto L17; } if (num5 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 18); goto L18; } if (num5 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 19); goto L19; } BinaryUtil.EnsureCapacity(ref buffer, offset, 20); goto L20; } L20: buffer[offset++] = (byte)('0' + (div = (num5 * 8389UL) >> 23)); num5 -= div * 1000; L19: buffer[offset++] = (byte)('0' + (div = (num5 * 5243UL) >> 19)); num5 -= div * 100; L18: buffer[offset++] = (byte)('0' + (div = (num5 * 6554UL) >> 16)); num5 -= div * 10; L17: buffer[offset++] = (byte)('0' + (num5)); } L16: buffer[offset++] = (byte)('0' + (div = (num4 * 8389UL) >> 23)); num4 -= div * 1000; L15: buffer[offset++] = (byte)('0' + (div = (num4 * 5243UL) >> 19)); num4 -= div * 100; L14: buffer[offset++] = (byte)('0' + (div = (num4 * 6554UL) >> 16)); num4 -= div * 10; L13: buffer[offset++] = (byte)('0' + (num4)); } L12: buffer[offset++] = (byte)('0' + (div = (num3 * 8389UL) >> 23)); num3 -= div * 1000; L11: buffer[offset++] = (byte)('0' + (div = (num3 * 5243UL) >> 19)); num3 -= div * 100; L10: buffer[offset++] = (byte)('0' + (div = (num3 * 6554UL) >> 16)); num3 -= div * 10; L9: buffer[offset++] = (byte)('0' + (num3)); } L8: buffer[offset++] = (byte)('0' + (div = (num2 * 8389UL) >> 23)); num2 -= div * 1000; L7: buffer[offset++] = (byte)('0' + (div = (num2 * 5243UL) >> 19)); num2 -= div * 100; L6: buffer[offset++] = (byte)('0' + (div = (num2 * 6554UL) >> 16)); num2 -= div * 10; L5: buffer[offset++] = (byte)('0' + (num2)); } L4: buffer[offset++] = (byte)('0' + (div = (num1 * 8389UL) >> 23)); num1 -= div * 1000; L3: buffer[offset++] = (byte)('0' + (div = (num1 * 5243UL) >> 19)); num1 -= div * 100; L2: buffer[offset++] = (byte)('0' + (div = (num1 * 6554UL) >> 16)); num1 -= div * 10; L1: buffer[offset++] = (byte)('0' + (num1)); return(offset - startOffset); }
public static int WriteInt64(ref byte[] buffer, int offset, long value) { var startOffset = offset; long num1 = value, num2, num3, num4, num5, div; if (value < 0) { if (value == long.MinValue) // -9223372036854775808 { BinaryUtil.EnsureCapacity(ref buffer, offset, 20); buffer[offset++] = (byte)'-'; buffer[offset++] = (byte)'9'; buffer[offset++] = (byte)'2'; buffer[offset++] = (byte)'2'; buffer[offset++] = (byte)'3'; buffer[offset++] = (byte)'3'; buffer[offset++] = (byte)'7'; buffer[offset++] = (byte)'2'; buffer[offset++] = (byte)'0'; buffer[offset++] = (byte)'3'; buffer[offset++] = (byte)'6'; buffer[offset++] = (byte)'8'; buffer[offset++] = (byte)'5'; buffer[offset++] = (byte)'4'; buffer[offset++] = (byte)'7'; buffer[offset++] = (byte)'7'; buffer[offset++] = (byte)'5'; buffer[offset++] = (byte)'8'; buffer[offset++] = (byte)'0'; buffer[offset++] = (byte)'8'; return(offset - startOffset); } BinaryUtil.EnsureCapacity(ref buffer, offset, 1); buffer[offset++] = (byte)'-'; num1 = unchecked (-value); } // WriteUInt64(inlined) if (num1 < 10000) { if (num1 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 1); goto L1; } if (num1 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 2); goto L2; } if (num1 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 3); goto L3; } BinaryUtil.EnsureCapacity(ref buffer, offset, 4); goto L4; } else { num2 = num1 / 10000; num1 -= num2 * 10000; if (num2 < 10000) { if (num2 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 5); goto L5; } if (num2 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 6); goto L6; } if (num2 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 7); goto L7; } BinaryUtil.EnsureCapacity(ref buffer, offset, 8); goto L8; } else { num3 = num2 / 10000; num2 -= num3 * 10000; if (num3 < 10000) { if (num3 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 9); goto L9; } if (num3 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 10); goto L10; } if (num3 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 11); goto L11; } BinaryUtil.EnsureCapacity(ref buffer, offset, 12); goto L12; } else { num4 = num3 / 10000; num3 -= num4 * 10000; if (num4 < 10000) { if (num4 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 13); goto L13; } if (num4 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 14); goto L14; } if (num4 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 15); goto L15; } BinaryUtil.EnsureCapacity(ref buffer, offset, 16); goto L16; } else { num5 = num4 / 10000; num4 -= num5 * 10000; if (num5 < 10000) { if (num5 < 10) { BinaryUtil.EnsureCapacity(ref buffer, offset, 17); goto L17; } if (num5 < 100) { BinaryUtil.EnsureCapacity(ref buffer, offset, 18); goto L18; } if (num5 < 1000) { BinaryUtil.EnsureCapacity(ref buffer, offset, 19); goto L19; } BinaryUtil.EnsureCapacity(ref buffer, offset, 20); goto L20; } L20: buffer[offset++] = (byte)('0' + (div = (num5 * 8389L) >> 23)); num5 -= div * 1000; L19: buffer[offset++] = (byte)('0' + (div = (num5 * 5243L) >> 19)); num5 -= div * 100; L18: buffer[offset++] = (byte)('0' + (div = (num5 * 6554L) >> 16)); num5 -= div * 10; L17: buffer[offset++] = (byte)('0' + (num5)); } L16: buffer[offset++] = (byte)('0' + (div = (num4 * 8389L) >> 23)); num4 -= div * 1000; L15: buffer[offset++] = (byte)('0' + (div = (num4 * 5243L) >> 19)); num4 -= div * 100; L14: buffer[offset++] = (byte)('0' + (div = (num4 * 6554L) >> 16)); num4 -= div * 10; L13: buffer[offset++] = (byte)('0' + (num4)); } L12: buffer[offset++] = (byte)('0' + (div = (num3 * 8389L) >> 23)); num3 -= div * 1000; L11: buffer[offset++] = (byte)('0' + (div = (num3 * 5243L) >> 19)); num3 -= div * 100; L10: buffer[offset++] = (byte)('0' + (div = (num3 * 6554L) >> 16)); num3 -= div * 10; L9: buffer[offset++] = (byte)('0' + (num3)); } L8: buffer[offset++] = (byte)('0' + (div = (num2 * 8389L) >> 23)); num2 -= div * 1000; L7: buffer[offset++] = (byte)('0' + (div = (num2 * 5243L) >> 19)); num2 -= div * 100; L6: buffer[offset++] = (byte)('0' + (div = (num2 * 6554L) >> 16)); num2 -= div * 10; L5: buffer[offset++] = (byte)('0' + (num2)); } L4: buffer[offset++] = (byte)('0' + (div = (num1 * 8389L) >> 23)); num1 -= div * 1000; L3: buffer[offset++] = (byte)('0' + (div = (num1 * 5243L) >> 19)); num1 -= div * 100; L2: buffer[offset++] = (byte)('0' + (div = (num1 * 6554L) >> 16)); num1 -= div * 10; L1: buffer[offset++] = (byte)('0' + (num1)); return(offset - startOffset); }
void ReadStringSegmentCore(out byte[] resultBytes, out int resultOffset, out int resultLength) { // SkipWhiteSpace is already called from IsNull byte[] builder = null; var builderOffset = 0; char[] codePointStringBuffer = null; var codePointStringOffet = 0; if (bytes[offset] != '\"') throw CreateParsingException("String Begin Token"); offset++; var from = offset; // eliminate array-bound check for (int i = offset; i < bytes.Length; i++) { byte escapeCharacter = 0; switch (bytes[i]) { case (byte)'\\': // escape character switch ((char)bytes[i + 1]) { case '"': case '\\': case '/': escapeCharacter = bytes[i + 1]; goto COPY; case 'b': escapeCharacter = (byte)'\b'; goto COPY; case 'f': escapeCharacter = (byte)'\f'; goto COPY; case 'n': escapeCharacter = (byte)'\n'; goto COPY; case 'r': escapeCharacter = (byte)'\r'; goto COPY; case 't': escapeCharacter = (byte)'\t'; goto COPY; case 'u': if (codePointStringBuffer == null) codePointStringBuffer = StringBuilderCache.GetCodePointStringBuffer(); if (codePointStringOffet == 0) { if (builder == null) builder = StringBuilderCache.GetBuffer(); var copyCount = i - from; BinaryUtil.EnsureCapacity(ref builder, builderOffset, copyCount + 1); // require + 1 Buffer.BlockCopy(bytes, from, builder, builderOffset, copyCount); builderOffset += copyCount; } if (codePointStringBuffer.Length == codePointStringOffet) { Array.Resize(ref codePointStringBuffer, codePointStringBuffer.Length * 2); } var a = (char)bytes[i + 2]; var b = (char)bytes[i + 3]; var c = (char)bytes[i + 4]; var d = (char)bytes[i + 5]; var codepoint = GetCodePoint(a, b, c, d); codePointStringBuffer[codePointStringOffet++] = (char)codepoint; i += 5; offset += 6; from = offset; continue; default: throw CreateParsingExceptionMessage("Bad JSON escape."); } case (byte)'"': // endtoken offset++; goto END; default: // string if (codePointStringOffet != 0) { if (builder == null) builder = StringBuilderCache.GetBuffer(); BinaryUtil.EnsureCapacity(ref builder, builderOffset, StringEncoding.UTF8.GetMaxByteCount(codePointStringOffet)); builderOffset += StringEncoding.UTF8.GetBytes(codePointStringBuffer, 0, codePointStringOffet, builder, builderOffset); codePointStringOffet = 0; } offset++; continue; } COPY: { if (builder == null) builder = StringBuilderCache.GetBuffer(); if (codePointStringOffet != 0) { BinaryUtil.EnsureCapacity(ref builder, builderOffset, StringEncoding.UTF8.GetMaxByteCount(codePointStringOffet)); builderOffset += StringEncoding.UTF8.GetBytes(codePointStringBuffer, 0, codePointStringOffet, builder, builderOffset); codePointStringOffet = 0; } var copyCount = i - from; BinaryUtil.EnsureCapacity(ref builder, builderOffset, copyCount + 1); // require + 1! Buffer.BlockCopy(bytes, from, builder, builderOffset, copyCount); builderOffset += copyCount; builder[builderOffset++] = escapeCharacter; i += 1; offset += 2; from = offset; } } resultLength = 0; resultBytes = null; resultOffset = 0; throw CreateParsingException("String End Token"); END: if (builderOffset == 0 && codePointStringOffet == 0) // no escape { resultBytes = bytes; resultOffset = from; resultLength = offset - 1 - from; // skip last quote } else { if (builder == null) builder = StringBuilderCache.GetBuffer(); if (codePointStringOffet != 0) { BinaryUtil.EnsureCapacity(ref builder, builderOffset, StringEncoding.UTF8.GetMaxByteCount(codePointStringOffet)); builderOffset += StringEncoding.UTF8.GetBytes(codePointStringBuffer, 0, codePointStringOffet, builder, builderOffset); codePointStringOffet = 0; } var copyCount = offset - from - 1; BinaryUtil.EnsureCapacity(ref builder, builderOffset, copyCount); Buffer.BlockCopy(bytes, from, builder, builderOffset, copyCount); builderOffset += copyCount; resultBytes = builder; resultOffset = 0; resultLength = builderOffset; } }