バイナリ情報を読込むには – プログラミング – Home

バイナリ情報を読込むには
 
通知
すべてクリア

バイナリ情報を読込むには

固定ページ 1 / 2

さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

バイナリでかかれたものを、あるバッファに読込むにはどのようにしたらいいのでしょ
うか??

バイナリの4BYTEを一つの塊として読込むにはどのような宣言をしたらいいのでし
ょうか


引用解決済
トピックタグ
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

コンピュータで言うデータは基本的に全てバイナリと考えてよいはずです。
バイナリのデータを文字コードとして見立てるとテキストになるだけの話です。
ファイルを開く時にテキストモードとバイナリモードがありますが、これは改行部分の
コードの扱いが違うというだけで本質的な読み込みに関しては何ら変わらないです。

バイナリで4バイトと書かれていますが、longなのか、BYTEで4つなのかで扱いは
変わります。バイトオーダーという奴なのですが、これに関しては基本的な知識ですし、
ご自分で調べたほうが良いでしょう。

データ型としてどう扱いたいのかまできちんと提示できないと多分期待する回答は得られませ
ん。
また、質問内容も漠然としているような気がします。
もっと具体例をあげて説明した方が良いです。
あと、自分の開発環境等の情報も添えましょう。

詳しくは、「発言される前に「使用上の注意」を必ずお読み下さい。」で。


返信引用
さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

バイナリで書かれたデータ(aa aa aa aa………)のようなファイルを開くには
CFile(filename , CFile::modeRead | CFile::shareDenyWrite | CFile::typeBinary)
で良いと思っています。

これを[aa aa aa aa]の値をある変数に読込むにはどのようにしたらいいのでしょう
か??
[aa aa aa aa]を4BYTEで読込むような処理を行いたいです。
改行があれば「ReadString」を使って読込むことができるのですが・・・


返信引用
tiss
 tiss
(@tiss)
ゲスト
結合: 23年前
投稿: 16
 

CFile inFile(inFile, CFile::typeBinary | CFile::modeRead |
CFile::modeNoTruncate);
BYTE byte[10]; //char byte[10]; でもいい
UINT nBytesRead = inFile.Read(byte, 4); //4で読み込むバイト数を指定する。
↑ 4バイト読む

nBytesRead に実際読み込んだバイトが入る 0 ならファイルエンド

File操作
http://www2c.airnet.ne.jp/phy/c++/41.html


返信引用
???
 ???
(@???)
ゲスト
結合: 24年前
投稿: 10
 

>これを[aa aa aa aa]の値をある変数に読込むにはどのようにしたらいいのでしょう
>か??
ある変数とは何(型)でしょう?

>改行があれば「ReadString」を使って読込むことができるのですが・・・
バイナリでも改行は入りますよ?CFileでは改行として扱わないだけで。
「AA AA 0D 0A」の「0D 0A」はWindowsでは改行です。(Unixの改行は別ですが)

CStringに読み込みたいのでしょうか?byteでよいのでしょうか?
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200208/02080083.txt
で出力したものを読み込みたいのであればintで読むべきかと思いますが?
CStringに直接読むのと intに読んでCStringの数字にするのと では結果は違いますよね?

PATIOさんの発言についてもう少し深く考えてみて欲しいです。


返信引用
さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

バイナリで書かれているファイルを読込んでfloatに変換しようと言うプログラムを考え
ています。

バイナリで「aa aa 12 45 12 34…」と打ち込んだデータを「aa aa」を一つのデータと
して読込み、それをfloatに変換して結果をファイルに保存する処理を行うプログラムで
す。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

もっと処理を具体的に考えましょう。
バイナリで書かれているといわれていますが、
バイナリで書かれているfloatのデータは、ファイル上でもfloatのデータ構造をもって
いるはずです。したがって、読み込み時にfloat型の変数に読み込めばいいだけです。
floatのデータ構造を意識してバイナリでデータを入力できるのでしょうか?

バイナリで書かれているデータをどうして変換する必要があるのでしょう?
変換の必要が無いからバイナリなのでは?
文字列で読み込んでfloatに変換するというなら話はわかりますけれど。

また、BCD(binary coded decimal notation)の場合は、単純にバイナリで書かれている
とは言いません。この場合はBCDでかかれていると表現するべきです。

あと、

>バイナリで「aa aa 12 45 12 34…」と打ち込んだデータを「aa aa」を一つのデータと
>して読込み、それをfloatに変換して結果をファイルに保存する処理を行うプログラムで
>す。

とかかれていますが、「aa aa」だと2バイトでは? HEX表現だったとしてですけれど。


返信引用
さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

ごめんなさい。2BYTEで書いてました。

そのようなデータが並んでいると思ってください。
「bb bb bb bb bb bb bb bb bb」←このようなデータがあると思ってください。

これを、4バイトずつ読込んでfloatに変換するプログラムです


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

floatの配列を十分な大きさ用意して、
その先頭へアドレスへ(無理やり)読み込む。

これで一応floatとして読み込めてはいますけど、
そういうことではないんですか?

float配列のイメージをそのままファイルに書き出したのであれば
これで大丈夫なはずですけど?


返信引用
???
 ???
(@???)
ゲスト
結合: 24年前
投稿: 10
 

何がわからないのかわからない・・・
floatとして4バイト読み込みたいというのならいまさら
関数名がわからないなんて言われたくないし。
floatに変換したいというのが何をさすのか・・・
「aa bb cc dd」を読み込んでfloatとして値がいくらになれば
またはfloatの4バイトの各バイトの値がいくらになればいいのだろう?


返信引用
tiss
 tiss
(@tiss)
ゲスト
結合: 23年前
投稿: 16
 

入力ファイルがHEX表現だったとしてですけれど
HEX表現..メモ帳とかVCのエディタ等で開くと
1234567890abcdefABCDEF の文字のみ使用されている?

float m_float;
UINT nBytesRead;
CString str;
char byte[10];
char* err;

memset(byte, 0, sizeof(byte));
nBytesRead = inFile.Read(byte, 4);
str = 0x;
str += byte;
m_float = (float)strtol(str, &err, 16);

のような感じ...ただし小数点以下は常に 0 になりますが?


返信引用
さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

WZ EDITORを使ってバイナリ編集モードで値を作っています。
テキストで開くと「bcdefghijklmnopqrstuvwxyz{|}~€≠ヤ・㊧炎旧克署葬灯楓利劒屆
撼」のような文字が出てきます。バイナリでデータを作成しているので当たり前ですよ
ね!?

strtolは数字以外は0になってしまうと思うのですが・・・


返信引用
tiss
 tiss
(@tiss)
ゲスト
結合: 23年前
投稿: 16
 

float m_float;
と定義して
UINT nBytesRead = inFile.Read(&m_float, sizeof(float));
と直接読み込む...これではだめ?
一番自然?な答えだとおもいますが・・そのまま書き込むと入力と同じファイルがでる?・・

あるいは
float m_float;
CString str;
char* err;
char chHEX[20];
UINT m_UINT;

UINT nBytesRead = inFile.Read(&m_UINT, sizeof(UINT));
wsprintf (chHEX, %08x, m_UINT);
str = 0x;
str += chHEX;
m_float = (float)strtol(str, &err, 16);

>strtolは数字以外は0になってしまうと思うのですが・・・
入力ファイルが16進数表示のテキストファイルと思いました...

それと strtol ですが、上の例では数字以外にもabcdefABCDEFが使えます。

str = 0x; 0x に続く数字とabcdefABCDEFを16進数テキストとみなします。
str += byte;
m_float = (float)strtol(str, &err, 16);

ここの16が16進数の意味
たとえば 0xABCD は 10進数の 43981 です。


返信引用
さくら
 さくら
(@さくら)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

ファイルに保存する場合は

出力ファイル.WRITE(データ,sizeof(float))と書込めばいいのかな??

複数のデータをファイルに書込むときはどのようにすればいいんですか??

できた結果を、逆に変換しなおす場合はどのような宣言をしてあげればいいんです
か??

それが正しい結果を確認したいので


返信引用
眠
 眠
(@眠)
ゲスト
結合: 23年前
投稿: 3
 

またいきなり別の質問!!!
今回はスレッドを分ける必要はないと思うけど
tissさんへ何か一言あってもいいのでわ?

WZ EDITORを使ってバイナリ編集モードで値を作ってたというのもびっくり!

>出力ファイル.WRITE(データ,sizeof(float))と書込めばいいのかな??
なぜWRITE? 前回Writeを使ったのでは?

ファイル.Open(書き込み
ファイル.Write(データ1,sizeof(float));
ファイル.Write(データ2,sizeof(float));
好きなだけ
ファイル.Close();

ファイル.Open(読み込み
ファイル.Read(データa,sizeof(float));
ファイル.Read(データb,sizeof(float));
書き込みに合わせる
ファイル.Close();

あーあとうとう書いちゃった(~_~;)


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました