示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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;
            }
        }