Asish6542165 Ответов: 2

У меня есть вопрос? Пожалуйста, перейдите по этой ссылке


просто перейдите по этой ссылке.

SHA256 и RIPEMD160HASH в программе C[^]

когда я заменю его

const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";


с

const unsigned char* rawdata = { 0x04, 0x6E, 0xAF, 0x09, 0x68, 0xAA, 0x89, 0x5A, 0xDD, 0xFE, 0xE5, 0x99, 0x56, 0x6F, 0x0B, 0x88, 0x02, 0x42, 0x46, 0x1D, 0x13, 0x77, 0xF4, 0x88, 0x7C, 0x9B, 0x84, 0x63, 0x1E, 0x13, 0x06, 0x7B, 0x96, 0xDB, 0x18, 0xC4, 0x1E, 0x0C, 0x20, 0x8F, 0x8D, 0x12, 0xEB, 0xCC, 0x3F, 0x99, 0xF2, 0x52, 0x29, 0x03, 0xAF, 0x61, 0x05, 0x83, 0x3E, 0x4C, 0xBA, 0xDE, 0x9D, 0x6A, 0x1D, 0x0F, 0x03, 0x91, 0x87 };


почему это дает мне ошибку сегментации

Что я уже пробовал:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2 Ответов

Рейтинг:
20

steveb

когда вы используете список инициализации (ваш 2-й случай), вам нужно изменить свое объявление на:

const unsigned char rawdata[] = { 0x04, 0x6E, 0xAF, 0x09, 0x68, 0xAA, 0x89, 0x5A, 0xDD, 0xFE, 0xE5, 0x99, 0x56, 0x6F, 0x0B, 0x88, 0x02, 0x42, 0x46, 0x1D, 0x13, 0x77, 0xF4, 0x88, 0x7C, 0x9B, 0x84, 0x63, 0x1E, 0x13, 0x06, 0x7B, 0x96, 0xDB, 0x18, 0xC4, 0x1E, 0x0C, 0x20, 0x8F, 0x8D, 0x12, 0xEB, 0xCC, 0x3F, 0x99, 0xF2, 0x52, 0x29, 0x03, 0xAF, 0x61, 0x05, 0x83, 0x3E, 0x4C, 0xBA, 0xDE, 0x9D, 0x6A, 0x1D, 0x0F, 0x03, 0x91, 0x87 };


Рейтинг:
12

k5054

оглядываясь назад на свой первоначальный вопрос, вы должны были

const unsigned char* rawdata = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";
unsigned long n = strlen(rawdata);
unsigned char *d = SHA256(rawdata, strlen(rawdata), 0);

Если все, что вы сделали, это изменили инициализацию rawdata к массиву шестнадцатеричных констант, то strlen() это будет провал. strlen подсчитывает количество байтов, начиная с данного указателя, и продолжает до тех пор, пока не найдет нулевой байт ('\0'). Вы можете добавить 0x00 в конец массива байтов, и тогда strlen будет работать, но имейте в виду, что если у вас есть ситуация, когда есть нулевой байт в rawdata тогда вы получите короткий счет для strlen.
Если вы используете const unsigned char[], то компилятор знает размер массива, даже если вы этого не делаете:
const unsigned char rawdata[] = { 0x04, 0x6E, 0xAF, 0x09, 0x68, 0xAA, 0x89, 0x5A, 0xDD, /* etc */ };
const size_t n = sizeof rawdata; // value of n is number of bytes in rawdata

Так как вам нужно знать количество байтов для передачи SHA256, мы можем просто использовать sizeof. Если вам нужно знать количество элементов в массиве, вы можете использовать следующее:
long arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
const size_t bytes_in_arr = sizeof arr;  // compile time calculation of bytes in arr (80 for x86_64)
const size_t elts_in_arr = sizeof arr/sizeof arr[0]; // compile time calculation of number of elements in arr (10 in this case)

Обратите внимание, что это будет работать только в том случае, если вы объявили свой массив с помощью [] обозначение. Если вы используете * обозначения (например, const char *data = "Hello World"), затем sizeof data равняется sizeof(char *), нет число байтов в инициализирующей строке.