Created
January 29, 2016 17:18
-
-
Save karno/3f2f99bcd5f7bab96d54 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace Cadena.Meteor | |
{ | |
internal static class MeteorJsonHelper | |
{ | |
public static unsafe string UnsafeUnescape(string jsonString, int decodedLength) | |
{ | |
var len = jsonString.Length; | |
var buf = new char[decodedLength]; | |
fixed (char* bufptr = buf) | |
fixed (char* srcptr = jsonString) | |
{ | |
var bp = bufptr; | |
for (var sp = srcptr; sp < srcptr + len; sp++) | |
{ | |
if (*sp == '\\') | |
{ | |
sp++; | |
switch (*sp) | |
{ | |
case '"': | |
*bp = '"'; | |
break; | |
case '\\': | |
*bp = '\\'; | |
break; | |
case '/': | |
*bp = '/'; | |
break; | |
case 'b': | |
*bp = '\b'; | |
break; | |
case 'f': | |
*bp = '\f'; | |
break; | |
case 'n': | |
*bp = '\n'; | |
break; | |
case 'r': | |
*bp = '\r'; | |
break; | |
case 't': | |
*bp = '\t'; | |
break; | |
case 'u': | |
// hex unicode | |
var code = 0; | |
for (var i = 0; i < 4; i++) | |
{ | |
sp++; | |
code <<= 4; | |
if (*sp <= '9' && *sp >= '0') | |
{ | |
code += *sp - '0'; | |
} | |
else if (*sp <= 'F' && *sp >= 'A') | |
{ | |
// code += *sp - 'A' + 10 | |
code += *sp - '7'; | |
} | |
else if (*sp <= 'f' && *sp >= 'a') | |
{ | |
// code += *sp - 'a' + 10 | |
code += *sp - 'W'; | |
} | |
else | |
{ | |
// invalid code, abort processing | |
sp -= i; | |
goto default; | |
} | |
} | |
*bp = Convert.ToChar(code); | |
break; | |
default: | |
// this is not registered escape code. | |
sp--; | |
*bp = *sp; | |
break; | |
} | |
} | |
else | |
{ | |
*bp = *sp; | |
} | |
bp++; | |
} | |
} | |
return new string(buf); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment