• ベストアンサー

バイナリデータの操作

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

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

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

  • ベストアンサー
回答No.1

パックって、packのことでしょうか? まとめた形のまま、たとえばファイルに保存したり、読み出したり するにはそれが便利だと思いますし、メモリも配列よりは 少なくなると思います。 しかし、配列のように個々の値を変えたりするなら、結局 unpackして配列として扱わなければならなくなりますね。 数値が整数と決まっているのなら、vecを使う手も考えられます。 vec($aaa, 0, 8) = 0xFF; vec($aaa, 1, 8) = 0x3C; vec($aaa, 2, 8) = 0xA3; ..... と代入しておき、あとで$aaaから vec($aaa, 1, 8) で、オフセット1の場所に入れた0x3Cの値を取り 出す、などということができます。これが一番メモリ効率としては いいように思います。 詳しくは、perldoc -f vec をご覧ください。

関連するQ&A

  • バイナリーで出てくるデータの変更

    計測器からバイナリーで出てくるデータを直し保存したいのですが char data1[2048] 計測器からデータを読み込み data1に入れるプログラム printf("Data read: %s\n", data1); とやると、バイナリデータのため文字化けしてしまいます。 このバイナリデータを呼び出して以下のように変更したいです。 ・11bits 4kWords 11111111111で正の最大値、 10000000000で0、 01111111111で負の最大値(一番左が符号ビット)となるバイナリデータを 01111111111で正の最大値、 00000000000で0、 11111111111で負の最大値と変更する 中心の数1024よりも大きい場合は中心の数を引き、 小さい場合には補数を取るためにー1.0を掛ければいいと思うのですが それをC言語でどのようにやればいいのかわかりません。 C言語にあまり詳しくないのですが、よろしくお願いします。

  • 数値から画像を作りたい

    プログラミング初心者です。 C言語の入門書はとりあえず勉強しました、現在はC++をさわっています。 数値が入っている配列 image[180][180] の値を使ってバイナリ形式の画像を作りたい と考えています。調べてみると下のような書き方をしています ofstream ofs("out.bin", ios::binary); ofs.write(reinterpret_cast<char *>(&a), sizeof(a)); この書き方をすると1ピクセルの値が書き込めるのでしょうか?それぞれの数値の間には ”,”のようなものを入れなくていいのでしょうか?改行はどうすればいいのでしょうか? ヘッダー部分が必要なのでしょうか? 一番簡単に配列の数字からバイナリ形式の画像を作る方法を教えていただきたいです。 宜しくお願いします。

  • 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); } ---------------------------------------

  • Java バイナリデータの扱い

    既出でないことを確認してみたつもりです。 <やりたいこと> 1.バイナリデータに埋め込まれたデータを読み込みたい。 2.バイナリデータの並びは例えば double d1,d2; char buffer[256]; int i1, i2; などとなっていてファイルヘッダとして同じフォーマットのファイルには全て埋め込まれています。これを読み込みたいです。 <質問> C言語であれば例えば構造体を定義してやって構造体のポインタに対して ヘッダの読み込みを行ってやれば上記のdoubleなどの変数は参照できる ようになりますが、Javaで同等の処理をやろうとするとどうすれば 良いのかわかりません。 良い方法があれば教えて下さい。宜しくお願いします。

    • ベストアンサー
    • Java
  • C#でバイナリデータをテキストフォームへ表示させるには?

    C#でバイナリデータをテキストフォームへ表示させるには? C#でバイナリファイルをテキストへ変換するツールを作成しています。 バイナリデータを配列へ格納し、その配列をテキスト変換してテキストフォームへ出力させるという処理を作成したいのですが、どうすれば良いのかどうしてもわかりません。 どのようなコードをどのようにして書けばよいのか、ご教示いただけないでしょうか。 よろしくお願いします。 (ちなみにC#を始めて1週間ほどです)

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

    テキストファイルに以下のデータがあるとします。 テキストデータの中身、 「 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 とこのようにメモリに格納したいのです。 格納するバイトオーダーはリトルエンディアン方式とします。 以上で、質問を終わりますが、質問が上手くできていないと思いますので、説明に不備があるかもしれません。その時はお手数ですが、連絡下さい。

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

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

  • バイナリファイルの操作(配列の操作について)

    こんにちは。 大変お世話になっております。 配列要素の先頭[0]から[5]までを文字列N、[6]から[1029]までをバイナリデータの計1030バイトの配列要素を使用しています。 [現在行なっている操作方法] 1. Buf[1500]とBuff[1500]を用意 2. fread関数により、Bufに1024バイトずつ格納 3. sprintf関数により、Buffの先頭[0]から[5]まで文字列挿入 4. strcat関数により、BuffとBufを結合 と言う形をとっています。 そこで、sprintfにて先頭から[5]までの文字列を挿入後、先頭から[5]までの配列要素を削除(不要になるため)し、バイナリデータのみにしたいのですが、何か方法はありますでしょうか? NNNNNNDDDDDDDDDDDDDDDDD・・・・・DDDDD←1029番 から NNNNNNを削除し、 DDDDDDD・・・・・DDDDD のみにしたいと思っています。 よろしくお願いします。

  • C言語とシリアル通信の送受信データの概念

    C言語とシリアル通信の送受信データの概念 今シリアル通信で基盤上のデータを読み書きするツールを作っています。 基盤はまだ手元にないので、先にプログラムと、基盤の動作を模したプログラムを作るつもりです。 基盤の説明にはデータはバイナリで送るようにと書かれていたので、 文字列で1バイトずつ割り当てようと考えました。 しかし、どうやって1234などの数値を1バイトずつ割り振るのか、 バイナリって何だっけと調べているうちにわけが分からなくなってきました。 たとえば1234という10進数の数値を送りたいとき、 現状ではchar型の文字列"1234"を渡しています。 もしかしてこれは間違っていて、本当は char s[] = { 1, 2, 3, 4 }; 16進数の場合はabcdなら char s[] = { 0xa, 0xb, 0xc, 0xd }; として渡すのが正しいのでしょうか。 これでprintfを使うと文字化けして何だかバイナリっぽいぞと感じましたが。 また、バイナリ以外ならどんな送り方があるのでしょう?

  • C言語に於けるバイナリデータ

    C言語等に於けるバイナリデータは基本的に前ゼロのついた状態で電算機は記憶・処理しているのでしょうか?例えば1なら00000001のように。

専門家に質問してみよう