memcpy инвертирование данных, язык C - PullRequest
0 голосов
/ 12 октября 2018

У меня есть сомнения здесь, я пытаюсь использовать memcpy() для копирования string[9] в unsigned long long int переменную, вот код:

unsigned char string[9] = "message";
string[8] = '\0';
unsigned long long int aux;

memcpy(&aux, string, 8);
printf("%llx\n", aux); // prints inverted data

/* 
 * expected: 6d65737361676565
 *  printed: 656567617373656d
 */

Как мне сделать этокопировать без инвертирования данных?

Ответы [ 2 ]

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

Похоже, вы только что случайно обнаружили, как процессоры хранят целочисленные значения.Есть две конкурирующие школы мысли, которые называются endian , с прямым и прямым порядком байтов, оба найдены в дикой природе.

Если вы хотите, чтобы они были в байтовом порядке,Целочисленный тип будет проблематичным, и его следует избегать.Просто используйте байтовый массив.

Существуют функции преобразования, которые могут переходить из одной порядковой формы в другую, хотя перед преобразованием нужно знать, какой тип использует ваша архитектура.

Так что, если вы 'читая двоичное значение, вы должны знать, в какой форме он находится, чтобы правильно импортировать его в собственный тип int.Как правило, при написании двоичных файлов рекомендуется выбирать согласованную форму порядка байтов, чтобы не догадываться, где схема «сетевой порядок байтов», используемая в подавляющем большинстве интернет-протоколов, является хорошим значением по умолчанию.Затем вы можете использовать такие функции, как htonl и ntohl для преобразования туда и обратно при необходимости.

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

Ваша система использует байтовый порядок байтов для целых чисел.Это означает, что младший байт идет первым.Например, 32-разрядное целое число будет хранить 258 (0x00000102) как 0x02 0x01 0x00 0x00.

Вместо того, чтобы копировать вашу строку в целое число, просто выполните цикл по символам и напечатайте каждый из них в шестнадцатеричном виде:

int i;
int len = strlen(string);
for (i=0; i<len; i++) {
    printf("%02x ", string[i]);
}
printf("\n");

Поскольку string - это массив unsigned char, и вы выполняете битовую манипуляцию с целью реализации DES, вам вообще не нужно его менять.Просто используйте его как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...