2013-05-13 18 views
12

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

このような何か:

こんにちは - > 68656C6C6F

私はキーボードで文字列を読みたいです。長さは16文字でなければなりません。

これは私のコードです。私はその操作を行う方法を知らない。私はfgetsのよりも優れて読みますが、必要であれば、私はそれを変更することができますので、私はfgetsのを使用しています

#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]); 
    } 
} 

...私はstrolについて読んだが、私はそれだけの六角intにstrの番号を変換すると思います。

これに関連して、uint8_t配列で読み取られた文字列を変換し、1つの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); 

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

+0

'uint8_t * OUTによって、' - > 'uint8_t *アウト=のcalloc(はsizeof(out_key)はsizeof(* OUT));' 'sizeof(out_key)'の代わりに 'strlen(key_DM)+ 1'を使用してください。 – BLUEPIXY

答えて

10
#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; 
} 
+0

私はちょうど例として印刷しています。しかし、私は他の文字列で文字列を保存したい。どのようにキャストをしなければならないのですか? – Biribu

+1

@Biribuこのプログラムの結果は 'outword'に格納されています。キャスティングは必要ありません。 – BLUEPIXY

+0

今私はそれを見ました。ごめんなさい。私はちょうど私が読むときにprintfを見た。それはうまく動作します。どうもありがとうございます。 – Biribu

5

を置き換えるこの

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

printf("%02X",word[i]); 
関連する問題