Я хочу записать шестнадцатеричную одну указатель char*
в другую char*
.
Для этого я взял этот фрагмент кода :
#include <stdio.h>
void DumpHex(const void* data, size_t size) {
char ascii[17];
size_t i, j;
ascii[16] = '\0';
for (i = 0; i < size; ++i) {
printf("%02X ", ((unsigned char*)data)[i]);
if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') {
ascii[i % 16] = ((unsigned char*)data)[i];
} else {
ascii[i % 16] = '.';
}
if ((i+1) % 8 == 0 || i+1 == size) {
printf(" ");
if ((i+1) % 16 == 0) {
printf("| %s \n", ascii);
} else if (i+1 == size) {
ascii[(i+1) % 16] = '\0';
if ((i+1) % 16 <= 8) {
printf(" ");
}
for (j = (i+1) % 16; j < 16; ++j) {
printf(" ");
}
printf("| %s \n", ascii);
}
}
}
}
И изменил это так:
#include <stdio.h>
char* DumpHex2(const void* data, size_t size) {
const int symbolSize = 100;
char* buffer = calloc(10*size, sizeof(char));
char* symbol = calloc(symbolSize, sizeof(char));
char ascii[17];
size_t i, j;
ascii[16] = '\0';
for (i = 0; i < size; ++i) {
snprintf(symbol, symbolSize, "%02X ", ((unsigned char*)data)[i]);
strcat(buffer, symbol);
memset(symbol,0,strlen(symbol));
if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') {
ascii[i % 16] = ((unsigned char*)data)[i];
} else {
ascii[i % 16] = '.';
}
if ((i+1) % 8 == 0 || i+1 == size) {
strcat(buffer, " ");
if ((i+1) % 16 == 0) {
snprintf(symbol, symbolSize, "| %s \n", ascii);
strcat(buffer, symbol);
memset(symbol,0,strlen(symbol));
} else if (i+1 == size) {
ascii[(i+1) % 16] = '\0';
if ((i+1) % 16 <= 8) {
strcat(buffer, " ");
}
for (j = (i+1) % 16; j < 16; ++j) {
strcat(buffer, " ");
}
snprintf(symbol, symbolSize, "| %s \n", ascii);
strcat(buffer, symbol);
memset(symbol,0,strlen(symbol));
}
}
}
free(symbol);
return buffer;
}
Работает и возвращает тот же вывод:
int main(int argc, char **argv) {
char* text = "Hello World! é";
DumpHex(text, strlen(text));
char* dump = DumpHex2(text, strlen(text));
printf("%s", dump);
free(dump);
return EXIT_SUCCESS;
}
Выход:
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 20 C3 A9 | Hello World! ..
48 65 6C 6C 6F 20 57 6F 72 6C 64 21 20 C3 A9 | Hello World! ..
Однако мои модификации, т. Е .:
snprintf(symbol, symbolSize, "| %s \n", ascii);
strcat(buffer, symbol);
memset(symbol,0,strlen(symbol));
Выглядишь плохо для меня (я новичок в C). Есть ли способ форматировать и добавлять строки проще?