にはどうしたら良いでしょうか?C言語がよくわからないのに、binaryファイルを操作して、プログラムを組むことになり、大変です。処理系はBorland BCC55 無料版です。
また問題を、より一般化して、以下はどうでしょうか。
あるアドレスp (char *p) から始まる連続するn Byteを、まず数として(8*n桁の二進数として)、ある変数kazuに格納するにはどうしたらよいでしょうか。しかる後に十進数としてprintf("%d", kazu); にしたり、計算したりしますが、その際の問題になろうことはありますか。
よろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
まずクリアしなければならない問題があります。
対象データのエンディアンはどうなっているのでしょうか?
Pentium系(およびその互換)のCPUでは複数バイトデータの格納方式はリトルエンディアンです。
バイト並びの値が0x00 0x00 0x00 0x01となっている場合、long dt = *((long *)p)で代入するとlong型変数dtは0x01000000(=16777216)として解釈されます。
そのように解釈されてよいのであれば、単純にポインタ参照してlong dt = *((long *)p)で代入すればよいことになります。
しかし、代入結果が0x00000001(=1)になる必要があるのであれば、long dt = *((long *)p)ではダメです。
MAKELONG,MAKEWORDマクロが使える環境であれば
long dt = MAKELONG(MAKEWORD(p[3], p[2]), MAKEWORD(p[1], p[0])) ;
WinSockライブラリが使える環境であれば
long dt = ntohl(*((long *)p)) ;
それ以外の環境なら自分でエンディアン調整の関数を作成する必要があります。
皆様ありがとうございました。良くわかりました。
ご回答を見る前に必要に迫られ、以下のような、サブ関数を作って対処しました。C言語のしろうとさんなので、合っているかどうか解りません。動作は問題ないようです。 bytesというポインタを先頭に、連続するnバイトを、読み、頭から0と1のビット並びを単純なずらずらした二進数として(ビッグエンディアンとして)解釈する、という動作を想定しています。問題が、ありましたら教えてください。
double bytes2numeral( unsigned char *bytes, int n)
{
double numeral;
int i;
numeral=0;
for (i=0; i<n; i++){
numeral = numeral*256 + bytes[i];
}
return(numeral);
}
なおデータ仕様は、ビッグエンディアンです。マシンはPentiumでリトルエンディアンのようです。toysmithさんのご指摘のとおり、「long dt = *((long *)p)」では、そのままではうまくいかなかったであろう、と思います。(偶然やらなかったですけど)。それにしても、初心者に、皆さん親切にありがとうございました。
No.2
- 回答日時:
long hoge = *((long*)p);
です。
ファイルがレコードとして保存されているのなら、struct に読み込むのが一般的です(というか楽です)。また、long int だとはじめからわかっているのなら long で宣言した変数に直接読み込めばよいのではないでしょうか?
No.1
- 回答日時:
こんにちは、honiyonです。
後者はよく分からないので、本題だけ(^^;
longint *Count;
Count = (longint *)p;
printf("%d\n", Count*);
なんてどうでしょ?
Cは久しぶりなので間違ってたらすいません汗
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のサフィックスについて
-
初期化関数でmallocしたい
-
【VB6.0】 あるフォームから他...
-
C#のループでtextboxに値を入れ...
-
二点の座標から距離や角度を求...
-
VB.NETでのイベントの途中終了
-
エクセルVBAでテキストボッ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
pthread_cond_waitとptherad_co...
-
VC++ (byte)(col & 0xFF) の意味
-
Pythonでのstrip()とsplit()の...
-
perlによるxmlファイルの取得
-
sublimit textっていうエディタ...
-
レコードセットにnullの場合
-
C言語で10行10列の行列式の値を...
-
タイムアウトする仕組みを作りたい
-
String型の値にスラッシュをつ...
-
アクセスできない保護レベルエ...
-
VBA public変数はどのようなこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のサフィックスについて
-
「ずっと憧れていました」は英...
-
初期化関数でmallocしたい
-
変数の型でlong longとunsigned...
-
1) A uniform ladder 10.0 m lo...
-
三項でたとえば交換って
-
VBA public変数はどのようなこ...
-
C#のループでtextboxに値を入れ...
-
VBAでcallで呼び出したsubを終...
-
他のフォームから別のフォーム...
-
レコードセットにnullの場合
-
エクセルVBAでテキストボッ...
-
Functionの戻り値を配列にした...
-
プログラムの素朴な質問です 分...
-
VB.NETでのイベントの途中終了
-
sublimit textっていうエディタ...
-
アクセスできない保護レベルエ...
-
チェックボックスを操作できな...
-
String型の値にスラッシュをつ...
-
Excel VBAでsub,dimは何の略?
おすすめ情報