/* Chrysalide - Outil d'analyse de fichiers binaires * hex.c - construction et interprétation de chaînes hexadécimales * * Copyright (C) 2021 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Chrysalide. If not, see . */ #include "hex.h" #include /****************************************************************************** * * * Paramètres : src = source de données à considérer. * * len = quantité de ces données à traiter. * * lower = spécifie un encodage à l'aide de minuscules. * * dst = zone allouée pour les données résultantes. [OUT] * * * * Description : Encode des données en chaîne hexadécimale. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void encode_hex(const char *src, size_t len, bool lower, char *dst) { size_t i; /* Boucle de parcours #1 */ uint8_t index; /* Indice de recherche */ /** * base = "".join([ "%02X" % i for i in range(256) ]) * encoded = "\n".join([ base[i : i + 32] for i in range(0, 512, 32) ]) * print(encoded) */ const char encoding_lookup[] = { "000102030405060708090A0B0C0D0E0F" "101112131415161718191A1B1C1D1E1F" "202122232425262728292A2B2C2D2E2F" "303132333435363738393A3B3C3D3E3F" "404142434445464748494A4B4C4D4E4F" "505152535455565758595A5B5C5D5E5F" "606162636465666768696A6B6C6D6E6F" "707172737475767778797A7B7C7D7E7F" "808182838485868788898A8B8C8D8E8F" "909192939495969798999A9B9C9D9E9F" "A0A1A2A3A4A5A6A7A8A9AAABACADAEAF" "B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF" "C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF" "D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF" "E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF" "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF" }; for (i = 0; i < len; i++) { index = src[i]; if (lower) { (*dst++) = tolower(encoding_lookup[index * 2]); (*dst++) = tolower(encoding_lookup[index * 2 + 1]); } else { (*dst++) = encoding_lookup[index * 2]; (*dst++) = encoding_lookup[index * 2 + 1]; } } *dst = '\0'; } /****************************************************************************** * * * Paramètres : digit = caractère hexadécimale à transcrire. * * value = valeur récupérée. [OUT] * * * * Description : Décode un caractère hexadécimal. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool decode_hex_digit(const char *digit, uint8_t *value) { bool result; /* Validité à retourner */ switch (*digit) { case '0' ... '9': *value = (*digit) - '0'; result = true; break; case 'a' ... 'f': *value = 0xa + (*digit) - 'a'; result = true; break; case 'A' ... 'F': *value = 0xa + (*digit) - 'A'; result = true; break; default: result = false; break; } return result; }