web-dev-qa-db-ja.com

CでASCII char []を16進数char []に変換します

ASCII=)のchar []を16進数のchar []に変換しようとしています。

このようなもの:

こんにちは-> 68656C6C6F

キーボードで文字列を読みたいです。 16文字の長さが必要です。

これが私のコードです。その操作の仕方がわかりません。私はstrolについて読んだが、str番号をint 16進数に変換するだけだと思う​​...

#include <stdio.h>
main()
{
    int i = 0;
    char Word[17];

    printf("Intro Word:");

    fgets(Word, 16, stdin);
    Word[16] = '\0';
    for(i = 0; i<16; i++){
        printf("%c",Word[i]);
    }
 }

読むのはfgetsよりも良いので、fgetsを使用していますが、必要に応じて変更できます。

これに関連して、uint8_t配列で読み取られた文字列を変換し、各2バイトを1つに結合して16進数を取得しようとしています。

私はarduinoで多く使用しているこの機能を持っているので、通常のCプログラムで問題なく動作するはずです。

uint8_t* hex_decode(char *in, size_t len, uint8_t *out)
{
    unsigned int i, t, hn, ln;

    for (t = 0,i = 0; i < len; i+=2,++t) {

            hn = in[i] > '9' ? (in[i]|32) - 'a' + 10 : in[i] - '0';
            ln = in[i+1] > '9' ? (in[i+1]|32) - 'a' + 10 : in[i+1] - '0';

            out[t] = (hn << 4 ) | ln;
            printf("%s",out[t]);
    }
    return out;

}

しかし、コードでその関数を呼び出すと、セグメンテーションエラーが発生します。

このコードを最初の回答のコードに追加します。

    uint8_t* out;
    hex_decode(key_DM, sizeof(out_key), out);

私はすべての必要なパラメーターを渡し、必要なものを配列に入れようとしましたが、失敗します...

14
Biribu
#include <stdio.h>
#include <string.h>

int main(void){
    char Word[17], outword[33];//17:16+1, 33:16*2+1
    int i, len;

    printf("Intro Word:");
    fgets(Word, sizeof(Word), stdin);
    len = strlen(Word);
    if(Word[len-1]=='\n')
        Word[--len] = '\0';

    for(i = 0; i<len; i++){
        sprintf(outword+i*2, "%02X", Word[i]);
    }
    printf("%s\n", outword);
    return 0;
}
12
BLUEPIXY

これを交換してください

printf("%c",Word[i]);

によって

printf("%02X",Word[i]);
5
MOHAMED

使用 %02X formatパラメーター:

printf("%02X",Word[i]);

詳細については、こちらをご覧ください: http://www.cplusplus.com/reference/cstdio/printf/

4
void atoh(char *ascii_ptr, char *hex_ptr,int len)
{
    int i;

    for(i = 0; i < (len / 2); i++)
    {

        *(hex_ptr+i)   = (*(ascii_ptr+(2*i)) <= '9') ? ((*(ascii_ptr+(2*i)) - '0') * 16 ) :  (((*(ascii_ptr+(2*i)) - 'A') + 10) << 4);
        *(hex_ptr+i)  |= (*(ascii_ptr+(2*i)+1) <= '9') ? (*(ascii_ptr+(2*i)+1) - '0') :  (*(ascii_ptr+(2*i)+1) - 'A' + 10);

    }


}
0
Jeeno