Décodage NetBIOS "A..P" (32 octets) -> "NAME "
| 528 | |
| 529 | // Décodage NetBIOS "A..P" (32 octets) -> "NAME<XX>" |
| 530 | void decodeNetBIOSLabel(const uint8_t *enc32, char *out, size_t outSize) { |
| 531 | if (!enc32 || !out || outSize == 0) return; |
| 532 | out[0] = '\0'; |
| 533 | |
| 534 | // Convertit 32 caractères A..P en 16 octets bruts |
| 535 | uint8_t raw[16]; |
| 536 | for (int i = 0; i < 16; ++i) { |
| 537 | uint8_t c1 = enc32[2 * i]; |
| 538 | uint8_t c2 = enc32[2 * i + 1]; |
| 539 | uint8_t hi = (c1 >= 'A' && c1 <= 'P') ? (uint8_t)(c1 - 'A') : 0; |
| 540 | uint8_t lo = (c2 >= 'A' && c2 <= 'P') ? (uint8_t)(c2 - 'A') : 0; |
| 541 | raw[i] = (uint8_t)((hi << 4) | lo); |
| 542 | } |
| 543 | |
| 544 | // 15 premiers octets = nom (paddé avec des espaces), 16e = suffixe/type |
| 545 | char name[16]; |
| 546 | memcpy(name, raw, 15); |
| 547 | name[15] = '\0'; |
| 548 | |
| 549 | // Trim des espaces de fin |
| 550 | int end = 14; |
| 551 | while (end >= 0 && name[end] == ' ') end--; |
| 552 | name[end + 1] = '\0'; |
| 553 | |
| 554 | uint8_t suffix = raw[15]; // ex: 0x00 pour <00> |
| 555 | |
| 556 | // Rend "NAME<XX>" (out doit être assez grand, p.ex. 40 octets) |
| 557 | // %02X fonctionne sur Arduino (printf/printf-like). |
| 558 | snprintf(out, outSize, "%s<%02X>", name, suffix); |
| 559 | } |
| 560 | |
| 561 | /*************************************************************************************** |
| 562 | ** Function name: responder |