示例#1
0
 public static int Hash(string str)
 {
     return(StringHasher.HashSubstring(str, 0, str.Length));
 }
        public static Key DecodeToken(string text, Token token)
        {
            if (token.Type != TokenType.EncodedString)
            {
                return(new Key(text.Substring(token.Start, token.Length), token.Hash));
            }

            int           cur    = token.Start;
            StringBuilder value  = new StringBuilder(token.Length);
            StringHasher  hasher = StringHasher.Create();

            for (int end = cur + token.Length; cur != -1 && cur < end;)
            {
                char ch = text[cur];
                if (ch == '\\')
                {
                    ch = (cur + 1 < end) ? text[cur + 1] : '\0';
                    switch (ch)
                    {
                    case '\"':
                    case '\\':
                    case '/':
                        hasher.AddChar(ch);
                        value.Append(ch);
                        cur += 2;
                        break;

                    case 'b':
                        hasher.AddChar('\b');
                        value.Append('\b');
                        cur += 2;
                        break;

                    case 'f':
                        hasher.AddChar('\f');
                        value.Append('\f');
                        cur += 2;
                        break;

                    case 'n':
                        hasher.AddChar('\n');
                        value.Append('\n');
                        cur += 2;
                        break;

                    case 'r':
                        hasher.AddChar('\r');
                        value.Append('\r');
                        cur += 2;
                        break;

                    case 't':
                        hasher.AddChar('\t');
                        value.Append('\t');
                        cur += 2;
                        break;

                    case 'u':
                        if (cur + 5 < end)
                        {
                            string buffer = text.Substring(cur + 2, 4);
                            if (uint.TryParse(buffer, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint decoded))
                            {
                                ch = (char)decoded;
                                hasher.AddChar(ch);
                                value.Append(ch);
                                cur += 6;
                            }
                            else
                            {
                                cur = -1;
                            }
                        }
                        else
                        {
                            cur = -1;
                        }
                        break;

                    default:
                        cur = -1;
                        break;
                    }
                }
                else
                {
                    hasher.AddChar(ch);
                    value.Append(ch);
                    cur++;
                }
            }

            if (cur == -1)
            {
                throw JsonException.New(Resources.Parser_InvalidStringToken);
            }

            return(new Key(value.ToString(), hasher.HashValue));
        }