File: System\IPv4AddressHelper.cs
Web Access
Project: src\src\libraries\System.Private.Uri\src\System.Private.Uri.csproj (System.Private.Uri)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics;
 
namespace System.Net
{
    // The class designed as to keep minimal the working set of Uri class.
    // The idea is to stay with static helper methods and strings
    internal static partial class IPv4AddressHelper
    {
        // methods
        // Parse and canonicalize
        internal static string ParseCanonicalName(string str, int start, int end, ref bool isLoopback)
        {
            // end includes ports, so changedEnd may be different from end
            int changedEnd = end;
            long result;
 
            unsafe
            {
                fixed (char* ipString = str)
                {
                    result = ParseNonCanonical(ipString, start, ref changedEnd, true);
                }
            }
 
            Debug.Assert(result != Invalid, $"Failed to parse after already validated: {str}");
 
            Span<byte> numbers =
                unchecked(
                [
                    (byte)(result >> 24),
                    (byte)(result >> 16),
                    (byte)(result >> 8),
                    (byte)(result)
                ]);
 
            isLoopback = numbers[0] == 127;
 
            Span<char> stackSpace = stackalloc char[NumberOfLabels * 3 + 3];
            int totalChars = 0, charsWritten;
            for (int i = 0; i < NumberOfLabels - 1; i++)
            {
                numbers[i].TryFormat(stackSpace.Slice(totalChars), out charsWritten);
                int periodPos = totalChars + charsWritten;
                stackSpace[periodPos] = '.';
                totalChars = periodPos + 1;
            }
 
            numbers[3].TryFormat(stackSpace.Slice(totalChars), out charsWritten);
            return new string(stackSpace.Slice(0, totalChars + charsWritten));
        }
    }
}