Last active
June 9, 2016 10:01
-
-
Save benaadams/0a3a69c5c186628e617e7c49b78f337d to your computer and use it in GitHub Desktop.
Fast unit ipaddress to string
This file contains hidden or 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
public unsafe static string FastIntegerToIPAddress(uint input) | |
{ | |
var input0 = (input & 0xff000000) >> 24; | |
var input1 = (input & 0xff0000) >> 16; | |
var input2 = (input & 0xff00) >> 8; | |
var input3 = (input & 0xff); | |
var length0 = input0 > 99 ? 3 : input0 > 9 ? 2 : 1; | |
var length1 = input1 > 99 ? 3 : input1 > 9 ? 2 : 1; | |
var length2 = input2 > 99 ? 3 : input2 > 9 ? 2 : 1; | |
var length3 = input3 > 99 ? 3 : input3 > 9 ? 2 : 1; | |
var value = new string('\0', length0 + length1 + length2 + length3 + 3); | |
fixed (char* ptr = value) | |
{ | |
var start0 = ptr + length0; | |
var start1 = 1 + ptr + length1 + length0; | |
var start2 = 2 + ptr + length2 + length1 + length0; | |
var start3 = 2 + ptr + length3 + length2 + length1 + length0; | |
*start0 = '.'; | |
*start1 = '.'; | |
*start2 = '.'; | |
if (length0 == 3) | |
{ | |
var digit = input0 * 41 >> 12; | |
input0 -= digit * 100; | |
*(start0 - 3) = (char)('0' + digit); | |
} | |
if (length1 == 3) | |
{ | |
var digit = input1 * 41 >> 12; | |
input1 -= digit * 100; | |
*(start1 - 3) = (char)('0' + digit); | |
} | |
if (length2 == 3) | |
{ | |
var digit = input2 * 41 >> 12; | |
input2 -= digit * 100; | |
*(start2 - 3) = (char)('0' + digit); | |
} | |
if (length3 == 3) | |
{ | |
var digit = input3 * 41 >> 12; | |
input3 -= digit * 100; | |
*(start3 - 2) = (char)('0' + digit); | |
} | |
if (length0 >= 2) | |
{ | |
var digit = input0 * 205 >> 11; | |
input0 -= digit * 10; | |
*(start0 - 2) = (char)('0' + digit); | |
} | |
if (length1 >= 2) | |
{ | |
var digit = input1 * 205 >> 11; | |
input1 -= digit * 10; | |
*(start1 - 2) = (char)('0' + digit); | |
} | |
if (length2 >= 2) | |
{ | |
var digit = input2 * 205 >> 11; | |
input2 -= digit * 10; | |
*(start2 - 2) = (char)('0' + digit); | |
} | |
if (length3 >= 2) | |
{ | |
var digit = input3 * 205 >> 11; | |
input3 -= digit * 10; | |
*(start3 - 1) = (char)('0' + digit); | |
} | |
*(start0 - 1) = (char)('0' + input0); | |
*(start1 - 1) = (char)('0' + input1); | |
*(start2 - 1) = (char)('0' + input2); | |
*start3 = (char)('0' + input3); | |
} | |
return value; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment