• 締切済み

ASCII変換について

ASCII変換についてです。 unsigned char *p; p = "0x01,0x02,0x03,0x04"; 4バイト分、*pをASCII変換して出力する方法を 教えて下さい。 結果は『01020304』と出力されると思います。 toasciiを使用するのかと思いましたが、うまく いかず困っております。お願い致します。

みんなの回答

  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.4

No.1の回答に対する補足への回答です。 まず "0x01,0x02,0x03,0x04" という文字列を、 文字列 "0x01"、文字列 "0x02"、 ... に分割します。そのために関数 strtok() を使います。 次に、文字列 "0x01" を数値の 1 に変換します。 関数 strtol() を使いましょう。 '1'を0x31と表示させたければ printf("0x%02x", '1') でOKです。 以上を踏まえてこんなかんじでどうでしょう。 #include <stdio.h> #include <stdlib.h> #include <strings.h> int main(void) {   char *p = "0x01,0x02,0x03,0x04";   char buff[20];   char *q;      strcpy(buff, p);   q = strtok(buff, ",");   while (q != NULL) {     char temp[3];          sprintf(temp, "%02d", strtol(q, NULL, 16));     printf("0x%02x,0x%02x,", temp[0], temp[1]);     q = strtok(NULL, ",");   }   return 0; } 最後にもカンマが表示されるのは工夫しましょう。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

あのう、じつはこの回答と、snotaさんの理解の仕方が間違ってるんですけど(^^;;; http://www.okweb.ne.jp/kotaeru.php3?q=745688 >unsigned char *p; > >と宣言されています。 >このpに『0x01,0x02,0x03,0x04,0x05』や >『"ABCDEF"』を代入したいと思っています。 まず、普通の変数とポインタ変数の違いを理解してくださいね。 C言語には、文字列を格納する変数はありません。 文字を配列として格納します。 >unsigned char *p; ここで宣言しているpはアドレスを格納するための変数です。 つまり、 p = "ABCDEF"; とやっても、pに文字列が入っているわけではありません。 "ABCDE"が存在するアドレス値が入っているだけです。 実際に文字を変数に入れるには、まずcharやunsigned charの変数を配列として宣言する必要があります。 unsigned char c[6+1]; で、strcpy()等で格納します。 strcpy(c, "ABCDEF"); また、変数の宣言時に値の初期化をすることもできます。 この場合は、 unsigned char c[] = "ABCDEF"; と書くことにより、変数cの配列の要素にA、B、C、D、E、F、\0が入ります。 >このpに『0x01,0x02,0x03,0x04,0x05』や ですが、これも、 unsigned char c[] = {0x01,0x02,0x03,0x04,0x05}; とすることで、配列cに初期値として代入することができます。 初期値として入れない場合は、 c[0] = 0x01; c[1] = 0x02; c[2] = 0x03; c[3] = 0x04; c[4] = 0x05; とする必要があります。 で、 unsigned char c[] = {0x01,0x02,0x03,0x04}; の場合に "01020304"としたいのであれば、 sprintf()を使うのが簡単です。 unsigned char c[] = {0x01,0x02,0x03,0x04}; char s[9]; sprintf(s, "%02x%02x%02x%02x", (int)c[0], (int)c[1], (int)c[2], (int)c[3]); で、sに"01020304"が入ります。

  • HOGERA23
  • ベストアンサー率28% (2/7)
回答No.2

むりやりやってみました。 #include <stdio.h> #include <stdlib.h> #include <strings.h> int main(void) {   unsigned char *p = "0x01,0x02,0x03,0x04";   char str[20];   char *temp;   strcpy(str, p);   temp = strtok(str, ",");   while (temp != NULL) {     printf("%02d", strtoul(temp, NULL, 16));     temp = strtok(NULL, ",");   }   return 0; }

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

p = "0x01,0x02,0x03,0x04"; ではなく p = "0x30,0x31,0x30,0x32,0x30,0x33,0x30,0x34"; としなくては、『01020304』とは出力されません。 "0x01"とは16進数の01の事です。 toasciiを使用するのであれば、文字コードを設定して渡してあげます。 ちなみに0x30は十進数で48で、「0」の文字コードになります。0x31は「1」の文字コードになります。 最初のp = "0x01,0x02,0x03,0x04"; はあくまでも数字ですよ。もう少しお勉強しましょうね。

snota
質問者

補足

申し訳ありません。自分なりに整理しました。 ASCII変換という表現が適切でないかもしれません。 最初の宣言などは特に変更はないのですが、 *p="0x01,0x02,0x03,0x04"; ↓↓↓ 0x30,0x31,0x30,0x32,0x30,0x33,0x30,0x34 と表示を行いたいのです。もう一度教えていただけませんか?

関連するQ&A