0

16 進数形式の char[] を 16 進数の int[] に変換しようとしています。

このようなもの:

こんにちは --> 68656C6C6F --> [68、65、6C、6C、6F]

これは私のコードです:

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

uint8_t* hex_decode(unsigned char *in, size_t len, uint8_t *out);

int main(void){
unsigned char  word_in[17], word_out[33];//17:16+1, 33:16*2+1
int i, len = 0;
uint8_t* out;


while(len != 16){
    printf("Set new word:");
    fgets( word_in, sizeof( word_in), stdin);
    len = strlen( word_in);
    if( word_in[len-1]=='\n')
        word_in[--len] = '\0';

    for(i = 0; i<len; i++){
        sprintf(word_out+i*2, "%02X",  word_in[i]);
    }
    if(len != 16){
        printf("Please, use a word of 16 chars long\n\n");
    }
}
printf("%s", word_in);
printf("\n");

hex_decode(word_out, sizeof(word_out), out);

return 0;
}

uint8_t* hex_decode(unsigned 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;

}

しかし、単語を印刷した後、セグメンテーション違反が発生しました。

その機能はarduinoで完璧に動作するので、私のコンピューターではうまく動作するはずです...どこに問題がありますか?

4

5 に答える 5

1

outポインターに割り当てを行う前にポインターを渡しているため、セグメンテーション違反が発生します。動的に割り当てられた配列を取得して割り当てるhex_decode必要があるか、呼び出し元が変換の出力を保持するのに十分な配列を提供する必要があります。uint8_t **out_ptr

別のプラットフォームで「機能する」理由は、未定義の動作を示すためです。arduino では、初期化されていないポインターに配置された任意の値が、outたまたまメモリ内の未使用の場所を指しています。その場所への書き込みはセグメンテーション違反をトリガーせず、コードが機能しているように見せかけます。

于 2013-05-13T17:07:14.270 に答える
0

やりたいことを比較すると、プログラムは複雑に見えます。

文字の16進数のASCIIコードを印刷したい場合は、単に使用できます

printf("%02X",'K'); // this will display the code ascii of 'K' in hexadecimal

コード ascii の単語を別の char 配列に出力したい場合。あなたが使用することができますsprintf():

int main() {
        char word_in[17]="hello", word_out[33];
        char *pi = word_in, *po = word_out;
        word_out[0]=0;

        for (;*pi;po+=2,pi++)
           sprintf(po,"%02X",*pi);

        printf("%s\n", word_out);
}

文字はバイナリ形式でメモリに保存されます。このバイナリ形式は、文字のコード ascii を表します。そして、その内容を印刷したい場合:

  • を使用する場合"%d": これにより、コード ascii が整数として出力されます
  • を使用する場合"%x": これにより、コード ascii が 16 進数として出力されます
  • を使用する場合"%c": これにより文字が出力されます
于 2013-05-13T17:11:32.857 に答える