Asish6542165 Ответов: 2

Как преобразовать массив символов в массив байтов в программе C


как я могу преобразовать шестнадцатеричный массив символов в байтовый массив?


например
data[]="600ffe422b4e00731a59557a5cca46cc183944191006324a447bdb2d98d4b408
"

как я могу преобразовать этот массив в байтовый массив строго на языке Си

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

.....................................................................................

2 Ответов

Рейтинг:
9

OriginalGriff

Да ладно тебе - ты хоть что-нибудь умеешь для себя делать? Хорошо, хэши могут быть немного сложными, но это тривиальная задача, которая не должна выходить за рамки среднего новичка после второй недели его курса...

Выделите новый массив байтов: в массиве char есть n символов, тогда длина должна быть (n - 1) / 2 + 1 байты.
Напишите функцию, которая принимает шестнадцатеричный символ и возвращает байт. Это довольно тривиально, самое простое решение (хотя и не самое лучшее) - это базовый switch :

unsigned char FromHex(char c)
   {
   switch(c)
      {
      case '0': return 0;
      case '1': return 1;
      case '2': return 2;
      case '3': return 3;
      case '4': return 4;
      case '5': return 5;
      case '6': return 6;
      case '7': return 7;
      case '8': return 8;
      case '9': return 9;
      case 'a': return 10;
      case 'b': return 11;
      case 'c': return 12;
      case 'd': return 13;
      case 'e': return 14;
      case 'f': return 15;
      }
   // Report a problem here!
   ...
   return -1;
   }
Затем выполните цикл через Ваш массив символов в парах.
Используйте функцию FromHex для преобразования каждого символа в двоичный и используйте оператор сдвига влево << для перемещения первого результата в старший байт, а двоичный или iot-в младший байт:
b1 = FromHex(InputData[i++];
b2 = FromHex(INputData[i++};
b = (b1 << 4) | b2;
Затем вставьте этот байт в выходной массив.

30 секунд реального размышления дали бы вам это: так почему же вы спросили нас?


k5054

5ed только для первого предложения.

Asish6542165

является ли этот код правильным

#include <stdlib.h>
#включить <stdio.h>
#include <string.h>
#include <unistd.h>
#include <openssl sha.h="">
#include <openssl ripemd.h="">
unsigned char FromHex(char c)
{
переключатель(c)
{
case '0': return 0;
случай "1": возврат 1;
случай "2": возврат 2;
случай "3": возврат 3;
случай "4": возврат 4;
случай "5": возврат 5;
случай "6": возврат 6;
случай "7": возврат 7;
случай '8': возврат 8;
случай "9": возвращение 9;
случай "а": возврат 10;
случай "Б": возвращение 11;
случай "с": возврат 12;
случай "D": возвращение 13;
случай "е": возвращение 14;
случай "F": возврат 15;
}

возврат -1;
}

тап_п(){

unsigned char rawdata [] = "046EAF0968AA895ADDFEE599566F0B880242461D1377F4887C9B84631E13067B96DB18C41E0C208F8D12EBCC3F99F2522903AF6105833E4CBADE9D6A1D0F039187";


int i,a,c=0;
unsigned char output[]="\0";
unsigned int b,b1,b2;


putchar('\п');
putchar('\п');

для(i=0;i<65;i++){

b1 = FromHex(rawdata[c]);
printf("%c",rawdata[c]);

с++;
b2 = FromHex(rawdata[c]);
printf("%c",rawdata[c]);

с++;
b = (b1 << 4) | b2;

выход[a]=b;
ля++;

}

putchar('\п');
putchar('\п');
printf("%s",выход);
putchar('\п');

i=strlen(выход);
printf("%d",i);

unsigned char *d = SHA256(output, 130, 0);

for (i = 0; i < SHA256_DIGEST_LENGTH; i++)
printf("%02x", d[i]);
putchar('\п');


}

OriginalGriff

Что он делает, когда вы его тестируете?
Я полагаю, вы тестируете свой код?

Asish6542165

попался!!! Мне потребовалось некоторое время, чтобы понять эту концепцию. Спасибо что ответили на мои вопросы

Рейтинг:
13

Rick York

Надеюсь, он сможет понять, как отделить один символ за раз во временную строку и преобразовать ее.

CPallini

5.

Asish6542165

спасибо