Скопируйте несколько шестнадцатеричных массивов в один в C - PullRequest
0 голосов
/ 12 сентября 2018

Моя проблема в том, что у меня есть 5 шестнадцатеричных массивов, и я хочу их объединить.

unsigned char sc1[] = "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0";        
unsigned char ip[] = "\xc0\xa8\x00\x01"; // IP 192.168.0.1  
unsigned char sc2[] = "\x68\x02\x00";
unsigned char port[] = "\x04\xd2"; // PORT 1234    
unsigned char sc3[] = "\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50" 

Конечно, порядок не должен меняться (порядок сетевых байтов, я думаю): P Я попробовал это с memcpy

unsigned char result[sizeof(sc1) + sizeof(ip) + sizeof(sc2) + sizeof(port) + sizeof(sc3)];

memcpy( result, sc1, sizeof(sc1) );
memcpy( result + sizeof(sc1), ip, sizeof(ip) );
memcpy( result + sizeof(sc1) + sizeof(ip), sc2, sizeof(sc2) );
memcpy( result + sizeof(sc1) + sizeof(ip) + sizeof(sc2), port, sizeof(port) );
memcpy( result + sizeof(sc1) + sizeof(ip) + sizeof(sc2) + sizeof(port), sc3, sizeof(sc3) );

и т. Д. Для каждого массива, но когда я пытаюсь его распечатать

for (int i = 0; i < sizeof(result); i++) {
    printf("%d ", result[i]);
}

результат просто глупость, поэтому я перестал возиться и надеюсь, что вы мне поможете.

РЕДАКТИРОВАТЬ: Извините, ребята, я понял, я так глуп! Конечно, я должен использовать %x

printf("%x ", result[i]);

1 Ответ

0 голосов
/ 12 сентября 2018

sizeof на каждом из этих массивов на +1 больше, чем вы думаете.Потому что каждая строка также содержит нулевой завершающий ноль (как любая строка).И это также увеличивает каждый массив на 1 байт.Например, sizeof(ip1) - это 5, а не 4.

Быстрый и грязный взлом вашей программы - вычитать 1 формуляру из каждого sizeof() вычисления.Вот так:

unsigned char result[sizeof(sc1) + sizeof(ip) + sizeof(sc2) + sizeof(port) + sizeof(sc3) - 5];

memcpy(result, sc1, sizeof(sc1)-1);
memcpy(result + sizeof(sc1)-1, ip, sizeof(ip)-1);
memcpy(result + sizeof(sc1)-1 + sizeof(ip)-1, sc2, sizeof(sc2)-1);
memcpy(result + sizeof(sc1)-1 + sizeof(ip)-1 + sizeof(sc2)-1, port, sizeof(port)-1);
memcpy(result + sizeof(sc1)-1 + sizeof(ip)-1 + sizeof(sc2)-1 + sizeof(port)-1, sc3, sizeof(sc3)-1);


for (int i = 0; i < sizeof(result); i++) {
    printf("%02x ", result[i]);  // %x, not %d to print hex
}

Выходы:

fc e8 82 00 00 00 60 89 e5 31 c0 c0 a8 00 01 68 02 00 04 d2 89 e6 50 50 50 50 40 50 40 50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...