user: Converte this assembly snippet into its equivalent C code:

```asm
<sentrycrashdl_convertBinaryImageUUID>:
  endbr64
  sub    $0x28,%rsp
  movdqa D0(%rip),%xmm0
  mov    %rsi,%rcx
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  movaps %xmm0,(%rsp)
L18:
  movzbl (%rdi,%rax,1),%edx
  shr    $0x4,%dl
  and    $0xf,%edx
  movzbl (%rsp,%rdx,1),%edx
  mov    %dl,(%rcx,%rax,2)
  movzbl (%rdi,%rax,1),%edx
  and    $0xf,%edx
  movzbl (%rsp,%rdx,1),%edx
  mov    %dl,0x1(%rcx,%rax,2)
  add    $0x1,%rax
  cmp    $0x4,%rax
  jne    L18
  movb   $0x2d,0x8(%rcx)
  movzbl 0x4(%rdi),%eax
  lea    0xa(%rdi),%rsi
  lea    0x18(%rcx),%rdx
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x9(%rcx)
  movzbl 0x4(%rdi),%eax
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0xa(%rcx)
  movzbl 0x5(%rdi),%eax
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0xb(%rcx)
  movzbl 0x5(%rdi),%eax
  movb   $0x2d,0xd(%rcx)
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0xc(%rcx)
  movzbl 0x6(%rdi),%eax
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0xe(%rcx)
  movzbl 0x6(%rdi),%eax
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0xf(%rcx)
  movzbl 0x7(%rdi),%eax
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x10(%rcx)
  movzbl 0x7(%rdi),%eax
  movb   $0x2d,0x12(%rcx)
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x11(%rcx)
  movzbl 0x8(%rdi),%eax
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x13(%rcx)
  movzbl 0x8(%rdi),%eax
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x14(%rcx)
  movzbl 0x9(%rdi),%eax
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x15(%rcx)
  movzbl 0x9(%rdi),%eax
  lea    0x24(%rcx),%rdi
  movb   $0x2d,0x17(%rcx)
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,0x16(%rcx)
  nopw   0x0(%rax,%rax,1)
L17:
  movzbl (%rsi),%eax
  add    $0x1,%rsi
  add    $0x2,%rdx
  shr    $0x4,%al
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x2(%rdx)
  movzbl -0x1(%rsi),%eax
  and    $0xf,%eax
  movzbl (%rsp,%rax,1),%eax
  mov    %al,-0x1(%rdx)
  cmp    %rdi,%rdx
  jne    L17
  movb   $0x0,0x24(%rcx)
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L2
  add    $0x28,%rsp
  ret
L2:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: tag: D0
type_guessed: byte[16]

tool: {"D0": [0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46]}

assistant: ```c
void sentrycrashdl_convertBinaryImageUUID(const unsigned char *src, char *dst) {
  const char g_hexNybbles[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
  for (int i = 0; i < 4; i++) {
    *dst++ = g_hexNybbles[(*src >> 4) & 15];
    *dst++ = g_hexNybbles[(*src++) & 15];
  }
  *dst++ = '-';
  for (int i = 0; i < 2; i++) {
    *dst++ = g_hexNybbles[(*src >> 4) & 15];
    *dst++ = g_hexNybbles[(*src++) & 15];
  }
  *dst++ = '-';
  for (int i = 0; i < 2; i++) {
    *dst++ = g_hexNybbles[(*src >> 4) & 15];
    *dst++ = g_hexNybbles[(*src++) & 15];
  }
  *dst++ = '-';
  for (int i = 0; i < 2; i++) {
    *dst++ = g_hexNybbles[(*src >> 4) & 15];
    *dst++ = g_hexNybbles[(*src++) & 15];
  }
  *dst++ = '-';
  for (int i = 0; i < 6; i++) {
    *dst++ = g_hexNybbles[(*src >> 4) & 15];
    *dst++ = g_hexNybbles[(*src++) & 15];
  }
  *dst++ = '\0';
}
```