- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリデータの書込みについて)
バイナリデータの書込みについて
このQ&Aのポイント
- バイナリデータの操作において、ビッグエンディアンのshortやlongのデータを書き込む際にデータが壊れてしまう問題について質問します。
- データ長を指定せずにpackしてデータを書き込むという方法は成功しているが、これからのデータ加工に不安を感じています。
- 質問の意図が理解できず困っており、質問内容に不足があれば補足することも可能です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
readの3番目の引数は読みこむバイト数を指定しますが、shortは 2byteですから、2 * 2で4byteを読みこむ必要があります。 それから、unpackを $data = unpack(...) の形で受け取るとこれはスカラーコンテクストになりますから、 展開された値の最初の要素だけが$dataに返されます。 @data = unpack(...) のように配列で受け取れば、リストコンテクストになり、展開された 値すべてが@dataに格納されます。 よって、以下のようにすればお望みの結果が得られるのではないで しょうか。 read (IN,$dataB,4); @dataA = unpack("n2",$dataB); $dataB2 = pack("n2",@dataA); print OUT $dataB2; ひょっとしたら、OUTはINと同じファイル、もしくはそれをコピーした ものなのではありませんか? だとしたら、「pack("n*", $dataA) にすると成功する」というのは、n2だと $dataAと空(すなわち0)の二つのshort値が書きこまれる(0で上書きされる 部分がある)のに対し、n*だと$dataAだけをpackした一つのshort値が書き こまれるので、0で上書きされる個所がない、ということなんだと類推されます。 あるいは実際はもっと複雑なpackを行っていて、他の要素との兼ね合い があるのかもしれませんが。
お礼
お返事遅れてすみませんでした。 全てHead_Syndicateさんのおっしゃる通りで、ばっちりうまくいきました。 ひょっとしたら・・・以下もまさにその通りでした。 本当にありがとうございます。 また、この場にて、質問させて頂く機会があるとは思いますが、そのときはよろしくお願いします。 本当に助かりました。ありがとうございました。