Байт массивін/CHAR массивін C санатындағы hexidecimal жолына түрлендіріңіз

Менің ойымша, байт массивтерін және массивтерді түсіну маған кейбір мәселелерді тудырады, міне менің мәселе:

Менде Websphere MQ хабарламаларын шығаратын және оларды мақсатты жүйеге жіберетін қосымша бар.

MQ хабарында MQBYTE24 (негізінен 24 байттық жиым) бар, ол хабардың MSGID. Менің мақсатым - оны он алтылық түрге айналдыру.

WMQ Explorer бағдарламасында Linux жүйесінде 1 кезектегі хабарда «AMQ QM01» хабарламасының идентификаторы бар (кем дегенде, ол бұл көрінеді) және байттар зерттеушіде көрсетілгендей төмен:

00000   41 4D 51 20 51 4D 30 31--20 20 20 20 20 20 20 20  |AMQ QM01        |
00010   BD F4 A8 4E A2 A3 06 20--                         |...N...         |

Енді менің кодым іске қосылғанда, сол хабардың идентификаторын алып, оны алты жолға айналдыруға тырысамын.

Отладка кезінде дәл хабардың идентификаторы:

AMQ QM01 \ 275 \ 364 \ 250N \ 242 \ 243 \ 006

Және менің конверсиям арқылы жүгіргеннен кейін (төмендегі код) мен аламын:

414D5120514D30312020202020202020FFFFFF4EFFFF6

Көріп отырғаныңыздай, бұл WMQ Explorer-нің көрсеткеніне біршама өзгеше, мұнда не дұрыс емес деп ойлаймын?

Мен MQBYTE24-ден char деп .... мені бір нәрсе істеп жатыр деп ойлаймын ...

Төменде «дұрыс емес нәтиже» жасайтын шағын үлгісі бар бағдарлама. ..... i арна, char-файлдың орнына байт массивін пайдалану керек пе?

Төменде келтірілген шығыс:

Нәтиже: 414D5120514D303120202020202020FFFFFF4EFFFF6

#include 
#include 
#include 

int main(){   
    char name[41]="AMQ QM01        \275\364\250N\242\243\006";
    char buffer[82]="";
    char *pbuffer = buffer;
    FILE *fp_1;
    FILE *fp_2;
    int size;
    char *buffer_1 = NULL;
    char *buffer_2 = NULL;

    int rc = convertStrToHex(buffer, name);
    printf( "Result: %s\n", pbuffer ); 
    }
    return 0;
}

int convertStrToHex(char *buffer, char str[10]){
    int len = strlen(str);
    int i;

    for( i = 0; i < len ;i++ ){
        sprintf(buffer, "%X", str[i]);
        buffer +=2;
    };
}

Көмек үшін рахмет :-)

Линтон

4
Бұл тек тестілік бағдарлама .... Әдетте менде прототиптер бар ;-)
қосылды автор Lynton Grice, көзі
Сіз, шынымен, оны шақырмас бұрын convertStrToHex үшін прототипін нақты көрсетуіңіз керек. main немесе бұрынғы қарапайым прототипін: int convertStrToHex (char *, char *);
қосылды автор pmg, көзі
@AaronGage: олар сегіздік сипатқа ие.
қосылды автор Ernest Friedman-Hill, көзі
сол жерде қашып жүргендер бар ма? Оларды қалай басқаруға болады? Сондай-ақ, неге char * pbuffer = буфер? printf-та тек «буфер» пайдаланыңыз ...
қосылды автор Aaron Gage, көзі

3 жауаптар

Компилятор мен платформа түріне байланысты қолтаңба қолтаңба немесе жоқ және printf әрекеті басқаша.

Тек қана [i] белгісін таңбаланбаған таңбаға шығарыңыз (немесе функцияның прототипінде str түрін өзгертіңіз) және ол жұмыс істейді. Мысалы (прототип өзгертілген):

int convertStrToHex(char *buffer, unsigned char str[10]){
    int len = strlen(str);
    int i;

    for( i = 0; i < len ;i++ ){
        sprintf(buffer, "%X", str[i]);
        buffer +=2;
    };
}

BTW: ол бөлінбеген ұзындықсыз жолды жіберу және sprintf пайдалану қауіпті деп есептеледі. Снпринтфті буфердің нақты ұзындығымен немесе ең болмағанда цикл ішінде өздігінен шектеу керек. Strlen (str) буфердің өлшемінен * 2 артық болған жағдайда.

2
қосылды

Бірнеше басқа жауаптар қазірдің өзінде көрсетіп тұрғандай, кодты FF түспеуі үшін unsigned char -ге символдарды қою қажет. Бірақ шын мәнінде тағы бір мәселе бар: соңында тек 6 жалғыз нөмірі шығуда бір таңба ретінде басып шығарылады. Әрбір таңбаның дәл екі орынға ие болуын қаласаңыз, сізге нөлдік жолақ өрістері қажет. Оны бәріне бірге қою, сіз аласыз

sprintf(buffer, "%02X", (unsigned char)str[i]);
1
қосылды
Барлығыңызға рахмет, сіз көп көмектестіңіз!
қосылды автор Lynton Grice, көзі

Тырысу

sprintf(buffer, "%X", (unsigned char)str[i]);
1
қосылды