كيفية تحويل char إلى hex المخزنة في نموذج uint8_t؟

StackOverflow https://stackoverflow.com/questions/9396265

  •  29-10-2019
  •  | 
  •  

سؤال

لنفترض أن لدي هذه المتغيرات،

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 (وهو مجرد نص عادي، مثل "مرحبًا") للست عشري والحفظ فيه ndef_msg؟كما ترون ndef_default_msg في شكل سداسي عشري.البيانات بالداخل ndef_msg يجب أن يكون شيء من هذا القبيل أيضا.

القليل من الخلفية، في البرنامج الأصلي (مصدر الرمز)، سيقوم البرنامج بفتح ملف، والحصول على البيانات ووضعها داخله ndef_msg, ، والتي سيتم بعد ذلك كتابتها في البطاقة.لكنني لا أفهم كيف يمكن أخذ البيانات وتحويلها إلى شكل سداسي عشري.

أريد تبسيط البرنامج بحيث يطلب من المستخدم نصًا مباشرةً (بدلاً من طلب ملف).

هل كانت مفيدة؟

المحلول

لماذا لا تقرأه في 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;
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;

آمل أن يمكن أن تساعدك

/*
 *  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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top