ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:ASCIIとバイナリの相互変換がしたい) ASCIIとバイナリの相互変換がしたい 2002/01/04 17:04 この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進表現はよくわからないのですが、どうしたらいいのでしょうか。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー tailkuppa ベストアンサー率53% (52/98) 2002/01/06 07:47 回答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 と同じです。 質問者 お礼 2002/01/06 21:52 ボケをかましていたようでお恥ずかしいです(汗 また、配列の初期化の方法が間違っていたようで、先頭にゴミがついていたのも原因だったようです。ひとつ勉強になりました。ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発Perl 関連する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配列の操作のようなことがしたいのですが。 アスキー変換 と 逆変換について (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」とセットしたいのですが、どのようにすれば良いのでしょうか? 初歩的なご質問で申し訳ございません。 よろしくお願いいたします ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム 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); } --------------------------------------- シリアル通信プログラミングでのバイナリデータ送信 UNIX系環境(IRIX)でのシリアル通信プログラムを作成していて、 バイナリデータの送信方法がわからず困っています。 write関数を使い、テキストデータの送信は出来ます。 write(fd,"テキスト",byte)のように。 ただ、今回はバイナリデータ送信を考えており、 例えば1byteのデータ00000001(01H)を送りたいと思っています。 このデータを送る場合、write関数で実現出来るのでしょうか? write(fd,0x01,1)←イメージです。 色々ネットで調べても出てきません。 開発がWindows環境ではないので、API関数が使えない状況で困っています(MsComm等が使えない)。また、fwrite関数は使用してはいけないみたいです。教えてください。宜しくお願いします。 シリアル通信でのバイナリデータの送受信方法 visual studio 2008 c++ を用いて 0x00~0xFFの任意のバイトをシリアル通信で送受信するプログラムを書いています。 0x00(NUL)を含んだ文字列は、文字列処理関数では処理出来ないので、以下のようにプラグラムを書くと文字列の最後を示すのに NULL を使っている処理系なので、文字列として読み込みをしているため,NULLで止まってしまいます。 -------------------------------------------------------- 略 DWORD dwWritten; char sendBuf[32]={0}; sendBuf[0] = 0x02; //02 STX sendBuf[1] = 0x00; //00 長 sendBuf[2] = 0xC0; //C0 取得コマンド sendBuf[3] = 0x10; //10 取得コマンド sendBuf[4] = 0x03; //03 ETX sendBuf[5] = 0xD0; //D0 Sum WriteFile(hComm, sendBuf, 6, &dwWritten, NULL); //hComm 指定ポート, 略 -------------------------------------------------------- そこで,送信データをバイナリデータとして扱う関数を使う必要があると思います。 ただ,いろいろ調べたのですが,バイナリデータとして読み書きする関数が分からず困っています。 そのため,バイナリデータとして扱う関数とその使用例を教えていただきたいです。 プログラム初心者のため,問題解決のために必要なコードや情報が不足していることがあるかと思います。 その際にはご指摘いただきたいと思います。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 文字コードから文字列への変換 よくわからないタイトルですみません(汗。 標準入力からデータを渡すと、I/Oをしてくれるというモジュールを書いているのですが、当初、テキストのみの設計のつもりだったのが、バイナリを扱うはめになってしまいました。 それで、バイナリはstdinから読めなさそうだったので、0xXYZという文字列にしてからstdin経由で渡そうと思ったのです。 今回の質問は、その文字列で書かれた16進コードを文字に直す方法なのです。 つまり、char buf[80] = "0x414243"という文字列を渡した場合、char buf2[80] = "ABC" という文字列を得たいのです。(0x41="A") 変な希望ですが、何通りか試したのですが、根っからのテキスト処理大好きPerl人間なので、Cの知識の無さに挫折してしまいました。 アドバイスをよろしくお願いいたします。 Excelでセル内の文字列をバイナリ値として扱う方法はないでしょうか。 Excelでセル内の文字列をバイナリ値として扱う方法はないでしょうか。 セルに貼付けた(エンコードされている)日本語URLをデコードしたいと思っております。 Unicode文字列はVBAからJScriptの関数を呼び出して対応しましたが、 長期的にはEUC-JPやその他の文字コードもデコードしたいと思っています。 手法は今も調べていますが現時点では、汎用的な関数を自作するしかないと認識しています。 そこで、 ADODB.Streamオブジェクトにバイナリモードでセルの値を書き込んだ後に、 テキストモードで任意のCharsetを指定してみたのですが、 セルの値は文字列として扱われ、バイナリ値として直接書き込めませんでした。 具体的には、EUC-JPでエンコードされた 「%a5%c6%a5%b9%a5%c8(テスト)」という文字列からReplace関数で「%」を除去し、 バイト型配列に代入した時点で、「a5c6a5b9a5c8」という文字列として扱われている という状態です(バイナリ値として入力されませんでした)。 上記以外のアプローチの仕方も含めて模索している状態です。 問題に対する考え方だけでもご指摘いただければと思います。 よろしくお願いします。 Socketによるデータ読み出しについての疑問 horagaiです。お世話になっております。 socketを使ってWebサーバーからHTTPでファイルを取得するスクリプトを組んでいます。 (1) while(<SOCK>){ push(@Data,$_); } というルーチンでソケットハンドル<SOCK>から読み出したデータをリスト@Dataに入れています。 ここで読み出すのがテキストファイルなら、ファイルデータが終了した時点でちゃんとWhileループが終了するのですが、GIF,JPEGのようなバイナリーファイルの場合、あるいはテキストファイルでも一番最後の行に改行コードが入っていない場合、ループが終了してくれません。どうやってデータの終了を確認してwhileループを終了したら良いでしょうか。 (2) こうやって取得したファイルデータを print @Data ; で表示させると、各行の先頭に半角スペースが入ってしまいます。これはpushかsocketの仕様によるものでしょうか。それとも私がどこかでミスをやっているのでしょうか。 Perlのバージョンは 5.004_04 OSはLinuxです。よろしくお願いします。 pack("C",0x61).pack("C",0x62)...を省略 $_=pack("C",0x61).pack("C",0x62).pack("C",0x68)... こういったバイナリ文字列をもっと簡単に$_=0x61.0x62.0x68のように書けませんか? $_=0x61.0x62.0x68ではうまくいきませんでした。 改行コード変換… 今、ソケットを用いたメール送信プログラムを作成していて、以下のページを 参考にプログラムを組んでいるのですが、次の意味が分かりません。 どなたかご存知の方がいらっしゃいましたら教えて頂きたいのですが。 # -------------------- # 改行コード変換 # -------------------- sub decode{ my $inf = $_[0]; $$inf =~ s/\x0D\x0A|\x0D|\x0A/\n/g; #←特にこの行が } 『Knave Web講座』"http://www.site-cooler.com/kwl/perl/smtp.htm#perl"より 別サーバーのcgiへバイナリデータを送る方法 サーバーAに、バイナリデータがあります。 これをサーバーBのcgiへデータを渡したいのですが、方法を教えてください。 HTMLで書くと、以下のようにc:\data.binを<form>でcgiに送信するようなイメージです。しかし、<input file>タグではセキュリティーのためvalueでファイルを指定することができません。 ここのc:\data.binは、ファイル名が変動するため、人間に手で選択させることはさせたくないです。 <form action="http://www.サーバーB.jp/Server_B.cgi" enctype="multipart/form-data" method="post"> <input type="file" value="c:\data.bin"> <input type="submit" value="サーバーAに送信"> </form> これを、cgi(Perl)を使用して、同じようなものを書くことはできますでしょうか? httpヘッダを書いて、その後ろにデータを送信して、、といった感じでできるような気がするのですが、 httpヘッダの書き方が分かりません。 受け側のサーバーBのcgiでは、CGI_Lite.pmを使用してバイナリデータを受信します。 通常、バイナリのデータ送信はftpを使用するのだと思いますが、相手側がftpに対応していません。 よろしくお願いします。 perlでASCII制御文字(キャレット記法)表示 (10進数で)0から31までに相当する、キャレット記法のASCII制御文字(\0,^A,^B,^C,^D,^E,^F,^G,^H,^I,\n,^K,\f,\r,^N,^O,^P,^Q,^R,^S,^T,^U,^V,^W,^X,^Y,^Z,^[,^\,^],^^,^_)をシェルスクリプトを使わずにperlプログラムで導出するプログラムはどうやって書けば良いのでしょうか? (以下のように、エラーを利用した回りくどい方法で考えましたがもっと簡単な方法はありませんか?) open TEMP,">& STDERR"; open STDERR,"> ascii.txt"; for (0..31){ printf ("%c",chr($_)); } open STDERR,">& TEMP"; close TEMP; open IN,"< ascii.txt"; while (<IN>){ /"(.{2})"/; print "$1,"; } close IN; サブルーチンの使い方 以下のプログラムを解読中ですが、いまいち理解できません。C言語の経験はあるのですが、Perl初心者のため、Perlの文法を中心に、以下のポイントについて教えてください。 (1)この関数で、引数が「&@」となっていますが、この&の意味は「サブルーチン」ということですか?? (2)2行目のmy ($block, @listin) = @_ で各$block, @listinに格納される値を教えてください。「@_」を調べてみたところ、「サブルーチンの引数を代入」とあるのですが、ここでは、map_block(&@)の&@が&blockと@litinに代入されるということですか??そもそも&@とは何でしょうか? (3)4行目のpush @listout, &$block() for (@listin) について、push関数を調べてみたところ、配列の最後尾に値を格納するということですが、&$block() for (@listin) の部分の意味がよくわかりません。どのような値が、配列listoutに格納されるのでしょうか? (解読中のプログラム) 1sub map_block (&@) { 2 my ($block, @listin) = @_; 3 my @listout = (); 4 push @listout, &$block() for (@listin); 5 return @listout; 6} 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ボケをかましていたようでお恥ずかしいです(汗 また、配列の初期化の方法が間違っていたようで、先頭にゴミがついていたのも原因だったようです。ひとつ勉強になりました。ありがとうございました。