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.
Zobrazeno 4 zpráv z 4.
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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.
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);
Zobrazeno 4 zpráv z 4.