ASCIIとバイナリの相互変換がしたい

このQ&Aのポイント
  • アスキーで入力されたバイナリを、ソケットで送信する方法を知りたいです。
  • バイナリデータを文字列に変換してソケット通信で送信する方法を教えてください。
  • Perlの16進表現を使用して、アスキーで入力されたバイナリをABCの文字列に変換する方法を教えてください。
回答を見る
  • ベストアンサー

ASCIIとバイナリの相互変換がしたい

アスキーで入力されたバイナリを、ソケットで送信するというものと書きたいのですが・・・。 具体的には、ファイルに 0x414243 と書いてあって、これを ABC という文字列でsocket通信で送りたいのです。 (これで、バイナリレベルでは414243が送れるはず) socketの部分はできているのですが、変換でつまずいています。 まず、配列 @temp を用意して、41 42 43を順にpushしました。で、次にこれをABCに直してソケットの送信関数に渡せばいいのですが、どうやってもABCになってくれません。 pack("C*","0x41","0x42","0x43") とやれば、ABCが出てきますが、 pack("C*",@temp) では当然のようにダメ。 "0x41""0x42""0x43"を順に@tempに入れましたが、これも失敗。 Perlの16進表現はよくわからないのですが、どうしたらいいのでしょうか。

  • Perl
  • 回答数1
  • ありがとう数2

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

  • ベストアンサー
  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

えと、41, 42, 43 ではなく、"0x41", "0x42", "0x43" と文字列にもせず、そのまま入れたらいいのではないでしょうか。 手元の環境では、 #/usr/bin/perl @temp = (0x41,0x42,0x43); print pack("C*", @temp); で、 ABC が出ました。 socket とかは使ったことがないのですが、0x41 とかの記法はC と同じです。 ちなみに、0101 みたいに0を先頭にすると8進法表記になります。 これもC と同じです。

pythian
質問者

お礼

ボケをかましていたようでお恥ずかしいです(汗 また、配列の初期化の方法が間違っていたようで、先頭にゴミがついていたのも原因だったようです。ひとつ勉強になりました。ありがとうございました。

関連するQ&A

  • ASCIIコードを文字に変換したい

    環境はVisualStdio.Net 2008のC++ Windowsフォームアプリケーションです。 C++の経験はまったくありません。 unsigned char型の配列 box[12]の中に既にアスキーコードでデータが格納されています。(例:box[0] = 48'0') これをtextbox->textにアスキーコードではなく文字で格納し、実行時に画面で確認できるようにしたいのですが、 (char)でキャストしてもfomat()で%xや%cにしても「0」でなく「48」で出力されてしまいます。 調べたらVBにはchrという関数があるみたいなんですが、これと同じ機能を持つ関数はVC++にはないのでしょうか?

  • バイナリデータの操作

    Perlでバイナリデータの操作(たとえば画像のピクセル部分の変更)をする場合 配列に一つ一つ数値を入れて操作するのと スカラでデータをいっぺんにパック(?)して操作するのとでは どちらがいいのでしょうか? ようはC言語のchar配列の操作のようなことがしたいのですが。

    • ベストアンサー
    • Perl
  • アスキー変換 と 逆変換について

    (1)文字列 2-ABC1234(9文字)をアスキーコード化し 変数配列txt(1 to 10)に txt(1)=322D「2-」,txt(2)=4142「AB」, txt(3)=4331「C1」,txt(4)=3233「23」, txt(5)=3400「4」,txt(6)=0000「」, txt(7)=0000「」,txt(8)=0000「」, txt(9)=0000「」,txt(10)=0000「」 とセットしたいのですが、どのようにすれば良いのでしょうか? (2)(1)の逆変換で変数txt(1 to 10)を 変数mozi as string に「2-ABC1234」とセットしたいのですが、どのようにすれば良いのでしょうか? 初歩的なご質問で申し訳ございません。 よろしくお願いいたします

  • Javaでアスキー文字を取得

    みなさんこんにちは。今回仕事で今までのPerlやCで書いたCGIなどのソースをうちでもJavaで書き直すことになったのですが、どうしてもわからないことがあり質問させていただきたいです。Javaでアスキー文字を取得する関数みたいなものはあるのでしょうか?たとえば48なら0をとってこいみたいなことがしたいのですが・・・(Perlならchrとゆう関数があります)またなんかいい方法があったらぜひ教えてください。かなり困っています。分かる方是非教えてください。よろしくお願いします。

  • C#で16進バイナリ文字列連結

    C#で16進バイナリ文字列連結 C#にてシリアル通信の勉強を始めたばかりなのですが 早速初っ端の基礎から解らず立ち往生しています。 ushort a=0x0050; byte b = 0x00; byte c = 0xff; ushort d = 0x03ff; byte e = 0x00; ushort f = 0x000c; と16進数値が居ます。 これを、リトルインディアン形式で連結させて 50 00 00 ff ff 03 00 0c 00 という電文にしたいのですが、どうやって繋げたらいいのでしょうか? 今まで"アスキー文字列"を単に繋げて送出したことしかなくて、いざバイナリ形式でやってみようとして うろたえてます。

  • テキストデータをバイナリデータに変換したい

    テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 000E6D4181AA,1234567890ABCDEF 0123456789AB,0100000000000000 050505AAAAAA,0200000000000000 070707BBBBBB,0300000000000000 012345CCCCCC,0400000000000000 cdef01DDDDDD,0500000000000000  ・  ・  ・ 」 12桁の数値(16進数)と16桁の数値(16進数)を「,」で区切ります。1行の終端は改行しています。 このテキストファイルにあるデータを以下のバイナリ形式に変換させたいのです。バイナリ形式の各行の16バイト目は、テキストデータにはデータがないので、「00」とします。「,」で区切ったバイナリ形式は「2C」になると思います。 テキストデータの左上から順に「00」は以下の、左上から順の「00」に対応します。 バイナリデータの中身、 「 00 0E 6D 41 81 AA 2C 12 34 56 78 90 AB CD EF 00 01 23 45 67 89 AB 2C 01 00 00 00 00 00 00 00 00 05 05 05 AA AA AA 2C 02 00 00 00 00 00 00 00 00 07 07 07 BB BB BB 2C 03 00 00 00 00 00 00 00 00 01 23 45 CC CC CC 2C 04 00 00 00 00 00 00 00 00 CD EF 01 DD DD DD 2C 05 00 00 00 00 00 00 00 00  ・  ・  ・ 」 ソースコードでの例、 テキストデータ1行目の1つ目の「,」までのデータ「000E6D4181AA」を、メモリ領域に読み込む。2桁の数値を1バイトで格納する。 つまり、 char buf[6]とすると、 buf[0]=0xAA buf[1]=0x81 buf[2]=0x41 buf[3]=0x6D buf[4]=0x0E buf[5]=0x00 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

  • RS232Cでバイナリーデータを送信する方法を教えてください。

    VBの初心者です。 RS232Cでバイナリーデータを送信したくVBでAPIを使いプログラムを組みたいと思っております。 色々な本を探してASCIIデータを送信するプログラムは発見し、改造を試みているのですが、WriteFile()ではどうしても&H81や&HF0と言ったデータが&H00に化けてしまいうまく送れません。 どなたか参考になる情報があれば教えて下さい。 よろしくお願い致します。

  • C言語でバイナリファイルの読み込み

    C言語のプログラミングに関する質問です。 x個(分かっている数)のfloat型の数値が入ったバイナリファイルを読み込んで、 要素数[x]のfloat型配列として扱うにはどういったコードを書けばよいのでしょうか? どなたかご教授いただければ幸いです。

  • socketでのバイナリファイルの扱い方

    javaのsocketを用いてファイルの送信サーバ、受信クライアントを作成しているのですが テストプログラムとしてスレッド化せずに送信・受信部のみ作りました。 症状はバイナリデータの転送がうまくできないことです。ソースを抜粋すると サーバ側で BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());//socketはSocketクラス BufferedInputStream in1 = new BufferedInputStream( new FileInputStream("test1.bmp")); BufferedInputStream in2 = new BufferedInputStream( new FileInputStream("test2.bmp")); while( (c = in1.read() ) != -1 ){   out.write(c); } while( (c = in2.read() ) != -1 ){   out.write(c); } クライアント側で BufferedOutputStream out1 = new BufferedOutputStream( new FileOutputStream("test1.out.bmp") ); BufferedOutputStream out2 = new BufferedOutputStream( new FileOutputStream("test2.out.bmp") ); BufferedInputStream in = new BufferedInputStream( s.getInputStream() ); while( ( c=in.read() ) != -1 ){   out1.write(c); } while( ( c=in.read() ) != -1 ){   out2.write(c); } とやっています。 クライアント側で1回目のin.readを抜けるときにはサーバ側は既に2回のwriteを終わっているようで ファイルはtest1.out.bmpにマージされていました。 サーバ側の1回目のwriteのオブジェクトがcloseしていないことが原因だと思い1回目のwriteが終わった時点でout.close()とした のですがそうやるとsocketも閉じてしまいsocket closeのエラーが生じてしまいました。 このようにならず1本のコネクションでバイナリのデータを複数送信する方法をご存知でしたら教えてください。 [環境] win2ksp1a,j2sdk1.4.1_03,java経験4ヶ月程度

  • C言語のバイナリモードでのfscanf関数の使い方について教えて下さい

    C言語のバイナリモードでのfscanf関数の使い方について教えて下さい。 2*2のint型配列バイナリデータを読み込んで、要素一つ一つを出力したいのですが、 fscanfでの書式指定の仕方がよく分かりません。 fscanf(入力元,"???",&入力先)の???の部分はどう指定すればよいのでしょうか? 下記のようなプログラムを書いたのですが、fscanfでデータを読み込めず、 data=0という出力で無限ループに入ってしまいます。 C言語初心者なので、かなり初歩的な質問かと思いますが、 よろしくお願いします。 -------------------------------------- char *fi; int data; fi = argv[1]; /* 2x2のint型配列バイナリデータを指定 */ input = fopen(fi,"rb"); while(!feof(input)){ fscanf(input,"%d",&data); printf("data=%d\n",data); } ---------------------------------------

専門家に質問してみよう