Как преобразовать символ в hex, сохраненный в форме uint8_t?

Предположим, что у меня есть эти переменные,

const uint8_t ndef_default_msg[33] = { 0xd1, 0x02, 0x1c, 0x53, 0x70, 0x91, 0x01, 0x09, 0x54, 0x02, 0x65, 0x6e, 0x4c, 0x69, 0x62, 0x6e, 0x66, 0x63, 0x51, 0x01, 0x0b, 0x55, 0x03, 0x6c, 0x69, 0x62, 0x6e, 0x66, 0x63, 0x2e, 0x6f, 0x72, 0x67 }; uint8_t *ndef_msg; char *ndef_input = NULL; 

Как преобразовать ndef_input (который является простым текстом, например «hello»), в hex и сохранить в ndef_msg ? Как вы видите, ndef_default_msg находится в шестнадцатеричной форме. Данные внутри ndef_msg должны быть такими.

Немного фона, в исходной программе ( исходный код ), программа откроет файл, получит данные и поместит их в ndef_msg , который затем будет записан на карту. Но я не понимаю, как он может принимать данные и преобразовывать их в hex.

Я хочу упростить программу, чтобы она напрямую запрашивала у пользователя текст (вместо запроса файла).

    Почему бы не прочитать его непосредственно в ndef_msg (минус \ 0, если он предположительно является чистым массивом). Шестерка только для презентации, вы могли бы просто выбрать десятичную или восьмеричную без последствий для контента.

     void print_hex(uint8_t *s, size_t len) { for(int i = 0; i < len; i++) { printf("0x%02x, ", s[i]); } printf("\n"); } int main() { uint8_t ndef_msg[34] = {0}; scanf("%33s", ndef_msg); print_hex(ndef_msg, strlen((char*)ndef_msg)); return 0; } 

    Вам, вероятно, придется обрабатывать чтение строки по-разному, чтобы допускать пробелы и, возможно, игнорировать \0 , это просто для иллюстрации моей точки.

    Может быть, не очень элегантный, но простой: определите таблицу поиска, которая отображает код символа (от 0 до 255) в нужное значение.

     // something like this: for( i = 0; i < INPUT_LEN; ++i ) { value_in = input[i]; value_out = lut[value_in]; array_out[i] = value_out; } 

    Я использовал такие не-элегантные решения пару раз (например, для цветокоррекции), и он работал одинаково хорошо, как другие причудливые решения

    Если я правильно понимаю, вы читаете данные шестнадцатеричного формата, хранящиеся в ndef_input , разбираете его и сохраняете значение в ndef_msg .

    вы можете использовать

     // parse the hex string and store it in an int variable int temp_int; sscanf(ndef_input, "%x", &temp_int); // covert it to uint8_t type ndef_msg = malloc(sizeof(uint8_t)); *ndef_msg = (uint8_t)temp_int; 

    Надеюсь, это поможет вам

     /* * DESCRIPTION * Converts a block in ASCII representation to binary * PARAMETERS * char * inMessage : message in ASCII format, '\0' terminated * OUTPUTS * uint8 * outMessage : output message in binary format * Format: outMessage[i], where i is byte number * RETURN VALUE * uint32 : number of converted bytes */ uint32 ascii2hex_block( uint8 * outMessage, int32 out_len, const char * inMessage ) { #define SET_BIT(U,N) ((U) |= (0x1 << (N))) int32 i = 0; int32 k = 0; int32 blockLen = 0; char inChar; uint8 hexVal; uint32 retVal = 0; while ( inMessage[blockLen]!='\0' ) blockLen++; blockLen = blockLen >> 1; if (blockLen <= out_len) // not enough space in output { retVal = blockLen; for (i = 0; i < blockLen; i++) { outMessage[i] = 0; inChar = inMessage[k]; hexVal = ascii2hex( inChar ); if (hexVal == 0xff) retVal = 0; // found an invalid character if ( (hexVal & (0x1 << 0) ) != 0 ) SET_BIT( outMessage[i], 4 ); if ( (hexVal & (0x1 << 1) ) != 0 ) SET_BIT( outMessage[i], 5 ); if ( (hexVal & (0x1 << 2) ) != 0 ) SET_BIT( outMessage[i], 6 ); if ( (hexVal & (0x1 << 3) ) != 0 ) HELPER_SET_BIT( outMessage[i], 7 ); k++; inChar = inMessage[k]; hexVal = ascii2hex( inChar ); if ( (hexVal & (0x1 << 0) ) != 0 ) SET_BIT( outMessage[i], 0 ); if ( (hexVal & (0x1 << 1) ) != 0 ) SET_BIT( outMessage[i], 1 ); if ( (hexVal & (0x1 << 2) ) != 0 ) SET_BIT( outMessage[i], 2 ); if ( (hexVal & (0x1 << 3) ) != 0 ) SET_BIT( outMessage[i], 3 ); k++; } } return retVal; } 

    И ascii2hex определяется следующим образом:

     /* * DESCRIPTION * Converts an ascii character ('0'..'f' or '0'..'F') to corresponding integer value. * In case of invalid ascii character, return value is 0xff * USAGE * uint8 ascii2hex( char inASCII ); * PARAMETERS * char inASCII : ascii character to convert * RETURN VALUE * uint8 : value of inASCII, 0xff for invalid input */ uint8 ascii2hex( char inASCII ) { uint8 retHex=0xff; if( (inASCII>=48) && (inASCII<=57) ) retHex = inASCII-48; else if( (inASCII>=65) && (inASCII<=70) ) retHex = inASCII-55; else if( (inASCII>=97) && (inASCII<=102) ) retHex = inASCII-87; return retHex; }