.NET GUID конвертация - PullRequest
       16

.NET GUID конвертация

4 голосов
/ 09 ноября 2011

У меня есть внешняя база данных, которая передает мне информацию. Один сохраняет свои данные в собственном формате GUID, а другой мой источник данных предоставляет стандартную строку формата .NET GUID.

Есть ли удобный способ преобразования из собственного GUID в Структура GUID ?

Также есть ли бит проверки, чтобы определить, является ли предоставленное значение Native GUID или нет? Я не могу найти ни одного, если есть один.

Разница в следующем:

typedef struct _GUID 
{  
   DWORD Data1;  
   WORD Data2;  
   WORD Data3;  
   BYTE Data4[8];
} GUID;

Данные1, Данные2 и Данные3 получают обратный порядок байтов, но Данные4 остаются прежними, для получения дополнительной информации см. http://en.wikipedia.org/wiki/Globally_unique_identifier

Ответы [ 3 ]

10 голосов
/ 18 июня 2013

Чтобы увидеть, является ли ввод в младшем порядке или нет BitConverter.IsLittleEndinan () помогает.

Мне просто нужно было сделать то же самое, и, используя ответ Пола Смита, приведенный выше, я заставил его работать с этим кодом. Полученный из его кода, но с исправлением в последнем порядке замены байтов и сжатый до одного флип, гарантирующий guid.FlipEndian (). FlipEndian () == guid.

C # код:

public static class Extensions
{
    /// <summary>
    /// A CLSCompliant method to convert a big-endian Guid to little-endian
    /// and vice versa.
    /// The Guid Constructor (UInt32, UInt16, UInt16, Byte, Byte, Byte, Byte,
    ///  Byte, Byte, Byte, Byte) is not CLSCompliant.
    /// </summary>
    [CLSCompliant(true)]
    public static Guid FlipEndian(this Guid guid)
    {
        var newBytes = new byte[16];
        var oldBytes = guid.ToByteArray();

        for (var i = 8; i < 16; i++)
            newBytes[i] = oldBytes[i];

        newBytes[3] = oldBytes[0];
        newBytes[2] = oldBytes[1];
        newBytes[1] = oldBytes[2];
        newBytes[0] = oldBytes[3];
        newBytes[5] = oldBytes[4];
        newBytes[4] = oldBytes[5];
        newBytes[6] = oldBytes[7];
        newBytes[7] = oldBytes[6];

        return new Guid(newBytes);
    }
}

код VB.net (перевод с онлайн-сервиса):

Импортирует System.Runtime.CompilerServices

Module ModuleExtension

    ''' <summary>
    ''' A CLSCompliant method to convert a big-endian Guid to little-endian
    ''' and vice versa.
    ''' The Guid Constructor (UInt32, UInt16, UInt16, Byte, Byte, Byte, Byte,
    '''  Byte, Byte, Byte, Byte) is not CLSCompliant.
    ''' </summary>
    <Extension()>
    Public Function FlipEndian(guid As Guid) As Guid
        Dim newBytes = New Byte(15) {}
        Dim oldBytes = guid.ToByteArray()

        For i As Integer = 8 To 15
            newBytes(i) = oldBytes(i)
        Next

        newBytes(3) = oldBytes(0)
        newBytes(2) = oldBytes(1)
        newBytes(1) = oldBytes(2)
        newBytes(0) = oldBytes(3)
        newBytes(5) = oldBytes(4)
        newBytes(4) = oldBytes(5)
        newBytes(6) = oldBytes(7)
        newBytes(7) = oldBytes(6)

        Return New Guid(newBytes)
    End Function

End Module
1 голос
/ 14 апреля 2012

Если я правильно понимаю вопрос, я разместил методы расширения, которые делают это, в Как прочитать .NET Guid в Java UUID .

0 голосов
/ 09 ноября 2011

Если на самом деле вы имеете дело с проблемами Endian, у вас не будет другого выбора, кроме как самостоятельно проанализировать строку в составные части Guid, переключить Endianness, а затем создать Guid что бы вы потом использовали.

...