Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Převod HEX řetězce na pole bytů

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Caster
Člen
Avatar
Caster:20.10.2022 1:23

Potřebuji převést MAC adresu na pole bytů umístěné od zadané pozice v dalším poli.

Zkusil jsem:

const char MAC[]   = "fc690c158264";
unsigned char Pole[52];


void HEX2bytes(const char buf_hex, unsigned char buf_byte, int pozice) {
        uint8_t tmp;
        for (int i = 0; i < 12; i += 2) {
                if (buf_hex[i] - '0' > 9) {
                        tmp = buf_hex[i] - 87;
                }
                else {
                        tmp = buf_hex[i] - '0';
                }
                tmp = tmp << 4;
                if (buf_hex[i + 1] - '0' > 9) {
                        tmp = tmp | buf_hex[i + 1] - 87;
                }
                else {
                        tmp = tmp | buf_hex[i + 1] - '0';
                }
        }
        buf_byte[pozice] = tmp;
        pozice++;
}

Chci docílit: V main programu použít:

HEX2bytes(MAC, Pole, 40);       //Z adresy MAC převeď 6 hex čísel a ulož je jako byty do Pole od zadané pozice
 
Odpovědět
20.10.2022 1:23
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:20.10.2022 2:42

Však je to přímočaré... V následujícím programu máš několik způsobů:

#include <stdio.h>
#include <string.h>

#define MAC_PAIRS 6
#define SIZE 52
#define POS 40

void mac_s_to_b(const unsigned char* src, unsigned char* dest, size_t pairs);
void copy_mem_to_pos(unsigned char* dest, const unsigned char* src, size_t size, size_t pos);
void mac_s_to_arr(const unsigned char* src, unsigned char* dest, size_t pairs, size_t pos);

int main(void) {

        const unsigned char* mac_s = "fc690c158264"; // MAC str
        unsigned char mac_b[MAC_PAIRS]; // MAC bytes
        unsigned char arr[SIZE];

        // prevod MAC string na MAC bytes
        mac_s_to_b(mac_s, mac_b, MAC_PAIRS);

        // kontrolni vypis mac_b
        // for (size_t i = 0; i < MAC_PAIRS; i++) printf("%02hhx ", mac_b[i]);

        // varianta 1. - pres vytvorenou funkci
        copy_mem_to_pos(arr, mac_b, sizeof(mac_b), POS);

        // varianta 2. - prime kopirovani pameti mac_b na pozici arr
        // memcpy(arr + POS, mac_b, sizeof(mac_b));

        // varianta 3. - primy prevod MAC string na pozici arr
        // mac_s_to_arr(mac_s, arr, MAC_PAIRS, POS);

        return 0;
}

void mac_s_to_b(const unsigned char* src, unsigned char* dest, size_t pairs) {
        for (size_t i = 0; i < pairs; i++) {
                (void)sscanf_s(src + 2 * i, "%02hhx", &dest[i]);
        }
}

void copy_mem_to_pos(unsigned char* dest, const unsigned char* src, size_t size, size_t pos) {
        memcpy(dest + pos, src, size);
}

void mac_s_to_arr(const unsigned char* src, unsigned char* dest, size_t pairs, size_t pos) {
        for (size_t i = 0; i < pairs; i++) {
                (void)sscanf_s(src + 2 * i, "%02hhx", &dest[pos + i]);
        }
}

První a druhá varianta vyžaduje pole mac_b a poskytuje mezivýpočet (MAC adresa v byte formě). Třetí varianta je přímá bez nutnosti použití pole mac_b.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
20.10.2022 2:42
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:20.10.2022 10:01

Skvelé, díky, už jsem z toho hotovej.

Zkusil jsem použít variantu 3. ale u prvního parametru v definici funkce jsem musel vyhodit "unsigned", jinak mi to hlásilo chybu nesoulad typu. Teď to funguje v pohodě.

void mac_s_to_arr(const char* src, unsigned char* dest, size_t pairs, size_t pos) {
        for (size_t i = 0; i < pairs; i++) {
                (void)sscanf_s(src + 2 * i, "%02hhx", &dest[pos + i]);
        }
}

Ještě bych potřeboval změnit pevně definovou pozici:

#define POS 40

na proměnnou, abychom ji při volání funkce mohl zadat číslem. Potřebuji zkopírovat dvě různé MAC adresy od pozice 40 a druhou od pozice 46.

 
Nahoru Odpovědět
20.10.2022 10:01
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:20.10.2022 10:12

To jsou konstanty které v programu neměníš. Tedy nic nebudeš převádět na proměnnou. Naopak vytvoříš druhou konstantu..

#define POS1 40
#define POS2 46

a pak budeš volat funkci 2x, jen s jinými argumenty.

mac_s_to_arr(mac_s_1, arr, MAC_PAIRS, POS1);
mac_s_to_arr(mac_s_2, arr, MAC_PAIRS, POS2);
Nahoru Odpovědět
20.10.2022 10:12
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.