【質問】ちょっと特殊なデータ変換について

タグの編集
投稿者 さしみ  (学生) 投稿日時 2016/5/22 02:39:59
おそらくこの質問文を読んだだけでは何の目的があってこの質問をしているかが理解できないかと思いますが、回答していただけたら幸いです。

バイナリファイルをstring型で読み込んだ後、各bitが同じ状態の数値データに変えることは可能でしょうか。
なぜわざわざ最初から数値型で読み込まないかというと、string型が可変長だからです。
それとも、string型にした時点でもともとのバイナリデータを再現することは不可能なのでしょうか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2016/5/22 08:15:09
バイナリファイルの読み込みに使うべきは、Byte 型の一次元配列です。
たとえば、System.IO.File.ReadAllBytes など。

データ量が多い場合は、Stream からの随時読み込みでも良いですし、
データ構造が決まっている場合はデシリアライズを使うといった手も
ありますが、それはさておき。


> バイナリファイルをstring型で読み込んだ後

テキストファイルであれば String 型を使っても良いですが、
バイナリファイルの読み込みに使ってはいけません。
そのエンコーディングでありえない組み合わせのバイナリが来た場合、
文字に変換できないため、データが破損する可能性があります。いわゆる文字化けです。
この場合、実行する OS によって化け方が異なったりもします。


> 各bitが同じ状態の数値データに変えることは可能でしょうか。

読み込んだ文字(Char)や文字列(String)自体には、その元となったデータが
どの文字コードで読み取られた物なのかという情報が含まれていません。

どのような bit 状態となるべきかという情報は、System.Text.Encoding というクラスで扱われます。

Encoding クラスは、Shift_JIS だったり EUC-JP だったり UTF-8 だったりといった、
文字列符号化方式を管理するクラスです。その Encoding クラスの GetBytes メソッドを
使うことで、バイナリデータである数値列に復元できます。


Encoding クラスを使わない方法として、UTF-16 なら AscW 関数、Shift_JIS/ANSI なら
Asc 関数を使う手もあります。
https://msdn.microsoft.com/ja-jp/library/zew1e4wc.aspx

ただし Asc/AscW の場合、1 文字単位でしか変換できないため、
文字列全体を変換する場合はループ処理が必要になります。
投稿者 shu  (社会人) 投稿日時 2016/5/23 07:29:53
> バイナリファイルをstring型で読み込んだ後、各bitが同じ状態の数値データに変えることは可能でしょうか。

String型で読み込んだ物はこの処理の後必要なのでしょうか?
必要なければこのような手順で読む意味がありません。既出の回答にあるようにByte配列を使えば
可変長だろうとよめるかと思います。
数値データというのが型でいうとIntegerなのかLongなのかSingleなのかDoubleなのかDecimalなのか
不定なのでしょうか?バイナリのストリームから型に合わせた読込を行うという方法は用意されているのでそちらでなんとかならないのでしょうか?

https://msdn.microsoft.com/ja-jp/library/system.io.binaryreader_methods(v=vs.110).aspx

投稿者 さしみ  (高校生) 投稿日時 2016/10/1 10:29:53
長らく時間が空いてすみません。
やはりというか、byte型を用いるのが最善策なのですね。素直にSystem.IO.File.ReadAllBytesを使おうと思います。
またBinaryReaderメソッドなるものは初めて知りました。