バイナリデータ読み込み – プログラミング – Home

バイナリデータ読み込み
 
通知
すべてクリア

[解決済] バイナリデータ読み込み

固定ページ 1 / 2

ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

環境 VC++ 6.0
OS windowsxp
ダイアログベースでクラスの新規作成 Genericクラス

お世話になります。

36 36 41 35 4C 31 30 30-2D 30 30 36 4B 00 48 2E
4B 41 53 48 4 4D 41 00-00 00 33 20 33 20 4D 35
・・・・・・

とゆうようなバイナリーデータを頭から2バイト,12バイト,12バイト,2バイト・・・
と変数に格納するプログラムを書いています(全部で256バイト)。

ファイルを開く事はCreateFileを使ってるのですが
読込みや変数への格納がいまいち分りません。
またreadfile はデータすべてを読み込んでくれるものと理解しています
(この場合は256全部読み込む)が合ってますか?
http://72.14.203.104/search?
q=cache:EiZXrCRUERAJ:www.microsoft.com/japan/developer/library/jpwinpf/_win32_r
eadfile.htm+ReadFile()&hl=ja&gl=jp&ct=clnk&cd=1&lr=lang_ja

どなたか分る方がいましたらよろしくお願い致します。

HANDLE hf
LPSTR strFile // 入力データを格納する領域を指定します
DWORD  dwResult;  // 読み取ったバッファ
long m_lAaa // 最初の2バイト
CString m_szBbb  // 次の12バイト
CString m_szCcc   //  次の12バイト
CString m_szDdd   // 次の12バイト

hF = CreateFile
(FilePath,ENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

if (hF == INVALID_HANDLE_VALUE)
{
 return FALSE ;
}
ReadFile(hF, strFile, GetFileSize(hFile , NULL), &dwResult, NULL);

//これ以降の処理で先頭2バイトを m_lAaa ・・・に格納する方法が不明


引用未解決
トピックタグ
ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

申し訳ありません

間違えてしまい二重送信してしまいました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 読込みや変数への格納がいまいち分りません。

「いまいち分かりません」の一言ではなにがどう分からんのかさっぱり分かりません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> とゆうようなバイナリーデータを頭から2バイト,12バイト,12バイト,2バイト・・・
> と変数に格納するプログラムを書いています(全部で256バイト)。

2 + 12x21 = 254 … 2バイト余ります。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

256 / (2+12+12) = 9 ... 22 かもしれないが、いずれにせよあまることは同じ。

あまりにもツッコミどころが多すぎるのですが、基礎は大丈夫?

strFile はどこ指してる?
ReadFile 1回呼ぶだけでファイル全部読まれたらたまらないよ。
CString にバイナリ入れることはできないよ。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

ああ GetFileSize してるのか... でもどのみちファイル名間違って指定されると
とんでもないことになりそうな気のせい?


返信引用
三草
 三草
(@三草)
ゲスト
結合: 19年前
投稿: 56
 

MSDNより。。。

-------------------------

BOOL ReadFile(
HANDLE hFile, // ファイルのハンドル
LPVOID lpBuffer, // データバッファ
DWORD nNumberOfBytesToRead, // 読み取り対象のバイト数
LPDWORD lpNumberOfBytesRead, // 読み取ったバイト数
LPOVERLAPPED lpOverlapped // オーバーラップ構造体のバッファ
);

nNumberOfBytesToRead
読み取り対象のバイト数を指定します。

-------------------------

上記の説明がご不明であれば、nNumberOfBytesToRead に 1 や 2 を指定し、
実行後 lpBuffer や lpNumberOfBytesRead を確認するとご理解いただけるかと。

# ご質問をまとめてピンポイントにすると、お望みの回答が得やすいかもしれません


返信引用
ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

すみません説明不足で・・・それと初心者です

バイナリファイルは256バイトです、この中で2,12,12,2,2,3,2,2,6,3,3,6バイトの
データがはいっています。データによってはプラス2,6バイトがはいっています。
この場合は全部で57バイト使用しています、256-57 = 199 この199バイトは
すべて 00 になっています。

ReadFile(hF, strFile, GetFileSize(hFile , NULL), &dwResult, NULL);
ReadFile(hF, &strFile, GetFileSize(hFile , NULL), &dwResult, NULL);
こうですね。

CStringにバイナリーデータは入らないのですか・・・
普通は、charの変数を準備して CStringに変換する形なんですか?

ReadFileは(ファイル, 読み取る場所の先頭アドレス, 読み取る最後, その値を格納,
NULL)

ReadFile(hf,1バイト目のアドレス,2バイト目,&dwResult, NULL)
こうすると &dwResultの場所には 36 36 とはなる?

GlobalAlloc を使って先頭アドレスを取得するのかと思っています。
http://72.14.203.104/search?
q=cache:otstINKDyPgJ:www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_g
lobalalloc.htm+GlobalAlloc()&hl=ja&gl=jp&ct=clnk&cd=1&lr=lang_ja

また厳しい突っ込みお願い致します。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> バイナリファイルは256バイトです、この中で2,12,12,2,2,3,2,2,6,3,3,6バイトの
> データがはいっています。データによってはプラス2,6バイトがはいっています。
> この場合は全部で57バイト使用しています、256-57 = 199 この199バイトは
> すべて 00 になっています。

要するに57バイト読めばいいのですね?
「データによっては」とは如何なる意味ですか?

> ReadFile(hF, strFile, GetFileSize(hFile , NULL), &dwResult, NULL);
> ReadFile(hF, &strFile, GetFileSize(hFile , NULL), &dwResult, NULL);
> こうですね。

LPSTRが如何なる型か知らんけど、おそらく違います

> CStringにバイナリーデータは入らないのですか・・・

CStringは文字列を扱うものです。
そのバイナリデータの途中に'\0'があると、おそらく望む結果は得られないでしょう。
末尾のみ'\0'であればそのバイナリデータは文字列として扱えますから、CStringに
格納しても構わないと思われます。

> 普通は、charの変数を準備して CStringに変換する形なんですか?

通常いかなる手段であれ、バイナリデータをCStringに格納しません。
そのバイナリデータとやらが実は文字列であるならその限りではありませんが。


返信引用
ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

「データによっては」というのは取得するファイルによって違うという事です。

進行がゆっくりになってしまって申し訳ありません。

サンプルを少し改造して見ました、突っ込みよろしくお願いします。
コメントは僕なりの理解です。

LPBITMAPFILEHEADER lpBf; // ビットマップはこれを使っているのですが
             // 今回の仕様に合うデータ型が分りません
hF = CreateFile
(FilePath,ENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

lpBf = GlobalAlloc(GPTR, sizeof('256')); // lpBf にバッファのアドレスを取得
ReadFile(hF, lpBf, sizeof('256'), &dwResult, NULL); //ファイルの0~256byteまで
                          //読み込む


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>サンプルを少し改造して見ました、突っ込みよろしくお願いします。

サンプルって?

> sizeof('256')

なんだこりゃ?

# 無礼な物言いで申し訳ないけど、基礎ができてない。
# '背伸び'しすぎではないかしら?


返信引用
ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

すみません基礎が出来て無くって

いつもはこのような形でしかsizeofは使っていなかったので・・・

char DT[10];
memset(DT,'\0',sizeof(DT));

sizeof(256);でいいですか?


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> すみません基礎が出来て無くって

# まずこれを作らないと、多分どうにもならないかも…。

> sizeof(256);でいいですか?

VC6だと多分 4 (intのサイズ)になりますが(256にはならない)、それで望み通りです
か?


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

>memset(DT,'\0',sizeof(DT));

この時に、なぜ、何のためにsizeofを使うのかが
理解できていないのではありませんか?


返信引用
ピースケ
 ピースケ
(@ピースケ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

そうですか・・・

256バイトの領域は確保できないのですか?

お手数かけます。テンパッテ冷静さをかいているので
もしバイナリーデータを読み込んで変数に入れる方法の参考に
なるHPとか知ってる方がいましたら教えて下さい。

落ち着いてから質問します。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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