• ベストアンサー

数字文字列をパック10進数に変換するにはどうしたらいいのでしょうか?

"1234567"という文字列を パック10進数に変換したいのですが、 どのようにしたら良いのでしょうか? まず左に4bitシフトさせてから符号部分の4bitを うまく取り除ければ出来ると思うのですが、どう実装したら良いか分かりません。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

#2です。入力文字のサイズと変換結果を格納するサイズを指定して、変換を行いたいように見えましたので、そのように修正しました。 #include <stdio.h> #include <stdlib.h> #include <string.h> void topack(int len1,char *str1,int len2,char *str2) { //len1:入力文字列長 //str1:入力文字 //len2:出力結果長 //str2:出力結果 int s1 = 0; int i; char x; memset(str2,0x00,len2); for (i=0;i<len2;i++){ s1++; if (s1 >len1) break; x = *str1++ & 0x0f; x = x << 4; s1++; if (s1<=len1){ x |= *str1++ &0x0f; } *str2++ = x; } } int main() { unsigned char out[8]; memset(out,0xff,sizeof(out)); topack(7,"12345679875",4,out); printf ("out=%02x%02x%02x%02x%02x%02x%02x%02x\n", out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]); memset(out,0xff,sizeof(out)); topack(8,"12345678777",3,out); printf ("out=%02x%02x%02x%02x%02x%02x%02x%02x\n", out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]); topack(3,"12345678777",4,out); printf ("out=%02x%02x%02x%02x%02x%02x%02x%02x\n", out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]); return 0; }

dp9
質問者

お礼

ありがとうございます。 こちらの方を参考にカズタマイズしながら勉強します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

以下は、入力文字列をパックに変換する関数:topackです。 --------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> void topack(char *str1,char *str2) { //str1:入力文字(終端NULLであること) //str2:出力結果 int s1 = strlen(str1); int s2 = (s1+1)/2; int i; char x; for (i=0;i<s2;i++){ x = *str1++ & 0x0f; x = x << 4; x |= *str1++ &0x0f; *str2++ = x; } } int main() { unsigned char out[8]; memset(out,0xff,sizeof(out)); topack("1234567",out); printf ("out=%02x%02x%02x%02x%02x%02x%02x%02x\n", out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]); memset(out,0xff,4); topack("12345678",out); printf ("out=%02x%02x%02x%02x%02x%02x%02x%02x\n", out[0],out[1],out[2],out[3],out[4],out[5],out[6],out[7]); return 0; } ---------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

"1234567"という文字列を変換したとき、期待する結果は、次のいずれですか? 1.0x12,0x34,0x56,0x70 の4バイト 2.0x01,0x23,0x45,0x67 の4バイト 3.上記以外(この場合は具体例を提示して下さい)

dp9
質問者

補足

返信有難う御座います。 期待している結果は1です。 現在のソースを以下に張ります。 このソースで期待した値が返ってきたので、 一応は解決したのですが、他に方法がありましたら 参考にさせていただきたく思います。 #include <stdlib.h> #include <string.h> int func(); char str1[]={'1','2','3','4','5','6','7'}; char str2[4]; int main(void) { int val=0; val = func(); return 0; } int func() { int j,k=0; int size1=sizeof(str1); int size2=sizeof(str2); for(j=0;j<size1;j++) { if(j%2==0) { str2[k] = (str1[j] - 0x30) << 4; }else{ str2[k] = str1[j] | (str1[j] - 0x30); k++; } } if(size1%2 != 0) { str2[size2-1] = str1[size1-1] | 0x03; } return atoi(str2); }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 数値を2進数文字列に変換するものなんですが・・・

    数値を2進数の文字列に変換するプログラムを関数として作成しているんですが、わからないことがあるのでお願いします。 char *itob(int value, int size, char binary[]) { int count = 0; /* binaryの添え字 */ int bit = size * 8; /* ビットになおす */ int mask = 1 << bit - 1; /* 先頭ビットに1を立てる */ /* 数値を2進数の文字列に変換する処理 */ do { if(value & mask) { /* valueとmaskのAND(論理積) */ binary[count] = '1';/* '1'を代入 */ }else { binary[count] = '0';/* '0'を代入 */ } value <<= 1; /* valueを左へ1ビットシフト */ count++; /* countを1たす */ }while(count < bit); /* 繰り返しを行う条件 */ binary[count] = '\0'; /* 最後に'\0'を入れる */ return binary; /* 変換した値を戻り値として返す */ } この前にもプログラムがありますが、コンパイルして実行する際に 10001 1110 と入力したら、 11111 という答えを出したいのですが、 これを実行すると、 00000000000000000000000000011111 となってしまいます。 これを11111とするためにはプログラムにどのような処理をすればよいのかわかりませんのでどなたかおわかりのかた解説をお願いします。

  • 10進数(+-)→2進数への変換(2)

    先ほど、ご質問させて頂きました者です、詳細にご説明させて頂きます (1)10進数:-16072 → 2進数:1100 0001 0011 1000 補足:2進数の16bit目の「1」は符号ビット「ー」 (2)10進数:+16072 → 2進数:0011 1110 1100 1000 補足:2進数の16bit目の「0」は符号ビット「+」 補足:10進数の値の範囲は    2進数で 符号1bitを含む16bitの値の範囲です と変換できるVB関数をご教示ください 宜しくお願いいたします

  • 3進数を10進数に変換

    3進数や5進数のように2の階乗ではない任意の進数の文字列を、C言語のビットシフトを使って10進数に変換するプログラムについて、質問させていただきます。 ビットシフトを使わないで、任意の進数の文字列を10進数に変換する方法は分かっていますが、ビットシフトを使った方が非常に計算が高速で出来るので、ビットシフトを使いたいと思っています。 下記のプログラムは4進文字列を10進整数に変換するものです。2進、8進文字列の場合は、シフトするビット数を1ビット、3ビット(つまり、ans <<= 1、ans <<= 3)にすれば計算することが可能です。しかし、3進数や5進数の場合、いろいろと考えたのですが、どのようにすれば良いのか分かりません。 下記のプログラムのようにビットシフトを使って3進数や5進数の文字列を10進数に変換するには、どのように工夫すれば良いでしょうか? どなたかご教授をお願いいたします。 #define STRING_NUM 2 /* 文字列の長さ */ int main(void) { int i; int ans = 0; /* 10進数の整数 */ char buf[STRING_NUM]; /* 4進数の文字列 */ buf[0] = '3'; buf[1] = '1'; for ( i = 0 ; i < STRING_NUM; i++ ){ printf(" %c", buf[i]); } printf("\n"); for ( i = 0 ; i < STRING_NUM; i++ ){ if ( buf[i] == '0' ){ ans <<= 2; /* シフトするビット数 */ ans |= 0; } if ( buf[i] == '1' ){ ans <<= 2; ans |= 1; } if ( buf[i] == '2' ){ ans <<= 2; ans |= 2; } if ( buf[i] == '3' ){ ans <<= 2; ans |= 3; } } printf( "ans = %d\n", ans ); return 0; }

  • 10進数の2進数文字列変換

    10進数の2進数文字列変換 ◆開発環境 OS:Linux(Ubuntu9.10) コンパイラ:gcc4.4 言語:C ◆質問内容 ポインタ*Aに格納されている10進数を2進数の文字列に変換し、 文字配列Bに格納したい。 バッファとして*fpを準備。 webで調査した結果を以下のソースのようにアレンジしましたが、 fputc関数の処理で、プログラムが強制終了してしまいます。 何か、良い方法ございませんでしょうか。 ◆サンプルソース void Dec_conv_bit(long *A,char *B){ unsigned int bit,n; //ビット比較用 unsigned int *fp = &n; n = (unsigned int)A; for(bit = 1 << sizeof(int)*8-1; bit > 0; bit >>= 1){ fputc((n & bit)?'1':'0',fp); } sprintf(B,"%s",fp); //putchar('\n'); }

  • 10進数の数字列を二進数に変換する

    10進数の数字列"1234"を16進数に変換すると04D2となる と問題集に書かれていたのですがどのように求めているのでしょうか。 ちなみに、問題ではJISの文字コードで一旦変換してから二進数に 変換していましたがいまいち理解できませんでした。 1234ならば 1→0031 2→0032 3→0033 4→0034 と一旦変換して 04D2を求めていました。 よろしくお願いいたします。

  • 16進数→2進数→16進数の際の符号

    いつもお世話になっております。 今回は基数変換についてお聞きしたいです。 フォームに入っている16進数の文字列(12ABなど)を受け取って、それを2進数にしてビットを反転させた後に再び16進数にしたいのです。 その部分はtoStringでできそうなのですが、この場合、符号はどのようになるのでしょうか? 少しやってみた感じでは符号なしのように動いたのですが実際はどうなっているのでしょうか? 探してみましたがはっきりと書いてあるところが見当たりませんでしたので詳しい方、ご教授願います。

  • 文字列→数値変換ルーチン

    こんにちは。 16進数の文字列を数値に変換するルーチンを調査したところ、以下のサイトを発見することができました。 http://www.cisnet.or.jp/home/tsuneoka/win32sub/appendex.html ただし、このサイトのルーチンはDOS用に作成されているため、int = 16bit が前提になっており、変換するとき、0x7fffffff より大きい値(0xfffffffe)は変換できません。 このサイトのルーチンを改造して、変換可能な最大値を符号なし32bit(0xffffffff)にするには、どうしたらよいのでしょうか?

  • ビットシフトについて

    12ビットのデータ(符号付き)を16ビットのデータに変換したいです。 自分なりに考えたのですが・・・ 最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、 右に4ビットシフトします(どちらも算術シフトとします) 例  0000 1011 1101 0101 (12bit のデータ) →1011 1101 0101 0000 (左にシフト) →1111 1011 1101 0101 (右にシフト) こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が 反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね? どうしたらいいでしょうか 切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。

  • 文字列から数字への変換

    文字列から数字への変換にはatoiなどを使うと思うのですが これだと文字として0を変換すると アルファベットなどを変換した場合と 同じになってしまいますよね? 0も入力を受け付けてなおかつ文字列は受け付けないように するにはどのようにすればよいのでしょうか? アドバイス・回答よろしくお願いします

  • 一般的なパック形式について教えてください。

    一般的なパック形式について教えてください。 送信されてくるファイルにパック形式のデータが含まれています。 そのデータをアンパックにする必要があります。 送り元からの情報には、 (1)一般的なパック形式である (2)16進数で表示 ⇒ アンパック形式であると15バイトで表示 (3)16進数で表示 ⇒ パック形式であると8桁で表示 と、この3点の情報しかありません。 8ビットで数値1文字表記を4ビットで1文字表記するぐらいしか理解できていないため、 そもそも、一般的といわれているパック形式とはどのようなものなのか、また、 アンパックした結果がどうなっていることが正しいのか、変換するためのロジック、 テストをする上で必要なデータ、もろもろ判断できていません。 いずれ、サンプルデータと予想結果をいただけるとのことですが、それよりも前に 設計・実装・テストを済ませる必要があります。 パック形式とは、4ビット単位で何進数でデータが送られてくるのか。 8ビットに変換する場合、頭4ビットには何を入れれば良いのか。符号? 返還後の8ビットは何進数であるべきか。 送られてきたデータからを後ろ4ビットを取り出し、他に取り出した後ろ4ビットと結合 すればよいと考えています。また、最終的には10進数でoutputするのが望ましいと思ってます。 しっかり理解できていないので、だらだらと書いてしましましたが、 要は一般的なパック形式ってなんだ?ということです。 どうか解答の方宜しくお願いします。

    • ベストアンサー
    • Java
このQ&Aのポイント
  • PX-045Aで印刷時に画面は日本語なのに英語で印刷される場合、書式の設定が原因と考えられます。設定画面から日本語に切り替えるか、書式の設定を確認してください。
  • EPSON社製品PX-045Aの印刷時に画面は日本語なのに英語で印刷される場合の直し方を教えてください。設定画面や書式の設定に問題がある可能性がありますので、確認してみてください。
  • PX-045Aで印刷時に画面は日本語なのに英語で印刷される場合、設定画面や書式の設定を確認してみてください。問題が見つからない場合は、メーカーのサポートに問い合わせることをおすすめします。
回答を見る