Jump to page: 1 2
Thread overview
Convert binary to UUID from LDAP
Mar 27, 2023
Alexander Zhirov
Mar 27, 2023
novice2
Mar 27, 2023
Alexander Zhirov
Mar 28, 2023
Alexander Zhirov
Mar 28, 2023
Kagamin
Mar 28, 2023
Alexander Zhirov
Mar 28, 2023
Alexander Zhirov
Mar 28, 2023
Kagamin
Mar 28, 2023
Alexander Zhirov
Mar 28, 2023
Alexander Zhirov
Mar 28, 2023
Jacob Shtokolov
Mar 28, 2023
WebFreak001
March 27, 2023

I get objectGUID data from LDAP as binary data. I need to convert ubyte[] data into a readable UUID. As far as I understand, it is possible to do this via toHexString(), but I have reached a dead end. Is there a way to make it more elegant, like this technique?

ubyte[] => [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194]
hex     => 9FC716A30D4A91499E7007C00CC107C2
March 27, 2023

On Monday, 27 March 2023 at 17:56:22 UTC, Alexander Zhirov wrote:

>

I get objectGUID data from LDAP as binary data. I need to convert ubyte[] data into a readable UUID. As far as I understand, it is possible to do this via toHexString(), but I have reached a dead end. Is there a way to make it more elegant, like this technique?

ubyte[] => [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194]
hex     => 9FC716A30D4A91499E7007C00CC107C2

https://run.dlang.io/is/JP01aZ

```
void main(){
    import std.stdio: writeln;
    import std.format: format;
    ubyte[] a = [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194];
    string b = format("%(%.2X%)",a);
    writeln(b);
}
```
March 27, 2023

On Monday, 27 March 2023 at 18:33:46 UTC, novice2 wrote:

>

https://run.dlang.io/is/JP01aZ

```
void main(){
    import std.stdio: writeln;
    import std.format: format;
    ubyte[] a = [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194];
    string b = format("%(%.2X%)",a);
    writeln(b);
}
```

Yes, the same result. I probably didn't write my post quite correctly. I mean get the UUID data type itself. Just using this example cast(ubyte[16])ubyte[] will not work, conversion error.

March 27, 2023

On 3/27/23 1:56 PM, Alexander Zhirov wrote:

>

I get objectGUID data from LDAP as binary data. I need to convert ubyte[] data into a readable UUID. As far as I understand, it is possible to do this via toHexString(), but I have reached a dead end. Is there a way to make it more elegant, like this technique?

ubyte[] => [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194]
hex     => 9FC716A30D4A91499E7007C00CC107C2

auto uuid = UUID(cast(ubyte[16])youruuiddata.ptr);

-Steve

March 28, 2023

On Tuesday, 28 March 2023 at 00:51:43 UTC, Steven Schveighoffer wrote:

>

auto uuid = UUID(cast(ubyte[16])youruuiddata.ptr);

ubyte[] arr = cast(ubyte[])value.attributes["objectGUID"][0].dup;
writeln(UUID(cast(ubyte[16])arr.ptr));

Error: cannot cast expression 'cast(ubyte*)arr' of type 'ubyte*' to 'ubyte[16]'

No, it's not possible to transform. The array is initially immutable(char[]).

March 28, 2023

On Monday, 27 March 2023 at 18:39:19 UTC, Alexander Zhirov wrote:
I mean get the UUID data type itself. Just using

>

this example cast(ubyte[16])ubyte[] will not work, conversion error.

writeln(toHexString(cast(ubyte[])value.attributes["objectGUID"][0]));

When converting to HEX, I get the string 121F4C264DED5E41A33F445B0A1CAE32, in which some values are reversed. I found ways on the Internet to transform the permutation method into the desired result, but most likely it will be a crutch rather than the right solution to lead to the final result 264c1f12-ed4d-415e-a33f-445b0a1cae32.

March 28, 2023

This guid is (int,short,short,byte[8]) in little endian byte order. So if you want to convert it to big endian, you'll need to swap bytes in those int and two shorts.

ubyte[] guid=...
int* g1=cast(int*)guid.ptr;
*g1=bswap(*g1);
March 28, 2023

On Tuesday, 28 March 2023 at 05:26:08 UTC, Alexander Zhirov wrote:

>

When converting to HEX, I get the string 121F4C264DED5E41A33F445B0A1CAE32, in which some values are reversed. I found ways on the Internet to transform the permutation method into the desired result, but most likely it will be a crutch rather than the right solution to lead to the final result 264c1f12-ed4d-415e-a33f-445b0a1cae32.

So far it has been possible to convert like this

{
    writeln(value.attributes["objectGUID"][0].toUUID);
}

UUID toUUID(const char[] objectGUID)
{
    if(objectGUID.length != 16)
        throw new Exception("objectGUID does not match the length");

    auto arr = (cast(ubyte[])objectGUID).array;

    auto part1 = arr[0 .. 4].reverse;
    auto part2 = arr[4 .. 6].reverse;
    auto part3 = arr[6 .. 8].reverse;
    auto part4 = arr[8 .. 10];
    auto part5 = arr[10 .. $];

    string hex =
        toHexString(part1) ~ '-' ~
        toHexString(part2) ~ '-' ~
        toHexString(part3) ~ '-' ~
        toHexString(part4) ~ '-' ~
        toHexString(part5);

    return cast(UUID)hex;
}
March 28, 2023

On Tuesday, 28 March 2023 at 08:15:03 UTC, Alexander Zhirov wrote:

>

So far it has been possible to convert like this

The idea was borrowed from here.

March 28, 2023

On Tuesday, 28 March 2023 at 05:05:58 UTC, Alexander Zhirov wrote:

>

Error: cannot cast expression 'cast(ubyte*)arr' of type 'ubyte*' to 'ubyte[16]'

Here is the working example:

import std.stdio;
import std.uuid;

void main()
{
	ubyte[] arr = [159, 199, 22, 163, 13, 74, 145, 73, 158, 112, 7, 192, 12, 193, 7, 194];
	UUID(arr[0 .. 16]).writeln;
}

You just need to take a slice of your array to guarantee that it has only 16 elements, and thus, pass it to UUID.

« First   ‹ Prev
1 2