Wie konvertiere ich char in hex, das in der Form uint8_t gespeichert ist?
Frage
Angenommen, ich habe diese Variablen,
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;
Wie kann ich ndef_input
(der nur ein einfacher Text ist, wie "Hallo") in hexadezimal konvertieren und in ndef_msg
speichern?
Wie Sie sehen können, liegt der ndef_default_msg
in hexadezimaler Form vor.Daten im ndef_msg
sollten auch so ähnlich sein.
Ein bisschen Hintergrundwissen, im Originalprogramm ( Quellcode ) öffnet das Programm eine Datei, getdie Daten und legen Sie sie in ndef_msg
, der dann in eine Karte geschrieben wird.Aber ich verstehe nicht, wie es die Daten nehmen und in hex konvertieren kann.
Ich möchte das Programm vereinfachen, damit der Benutzer direkt nach Text gefragt wird (anstatt nach einer Datei zu fragen).
Lösung
Warum nicht direkt in ndef_msg einlesen (abzüglich der \ 0, wenn es sich um ein reines Array handelt)?Das Hex dient nur zur Darstellung. Sie hätten einfach Dezimal oder Oktal auswählen können, ohne dass dies Auswirkungen auf den Inhalt hat.
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;
}
Wahrscheinlich müssen Sie das Lesen der Zeichenfolge anders behandeln, um Leerzeichen zuzulassen und vielleicht \0
zu ignorieren. Dies dient nur zur Veranschaulichung meines Standpunkts.
Andere Tipps
Vielleicht nicht sehr elegant, aber einfach: Definieren Sie eine Nachschlagetabelle, die einen Zeichencode (0 bis 255) einem gewünschten Wert zuordnet.
// something like this:
for( i = 0; i < INPUT_LEN; ++i ) {
value_in = input[i];
value_out = lut[value_in];
array_out[i] = value_out;
}
Ich habe einige Male solche nicht eleganten Lösungen verwendet (z. B. für die Farbzuordnung) und sie funktionierten genauso gut wie andere ausgefallene Lösungen
Wenn ich richtig verstehe, lesen Sie Daten im Hex-Format, die im ndef_input
gespeichert sind, analysieren sie und speichern den Wert im ndef_msg
.
können Sie verwenden
// 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;
char *ndef_input="Z"; uint8_t b=90; //assume this is your character Z in decimal ascii code 90 and HEX = 5A uint8_t LSB = b & 0x0F; // this is LSB 10 decimal = A uint8_t MSB = (b & 0xF0)>>4; // this is MSB 5 in decimal = 5 in Hex cout << "MSB" << MSB << "LSB" << LSB;
Ich hoffe, das kann Ihnen helfen
/*
* 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;
}
Und ascii2hex ist wie folgt definiert:
/*
* 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;
}