• 締切済み

アドレスp (char *p) からの連続する4Byteをlong intとして解釈して変数Lに代入する

にはどうしたら良いでしょうか?C言語がよくわからないのに、binaryファイルを操作して、プログラムを組むことになり、大変です。処理系はBorland BCC55 無料版です。 また問題を、より一般化して、以下はどうでしょうか。 あるアドレスp (char *p) から始まる連続するn Byteを、まず数として(8*n桁の二進数として)、ある変数kazuに格納するにはどうしたらよいでしょうか。しかる後に十進数としてprintf("%d", kazu); にしたり、計算したりしますが、その際の問題になろうことはありますか。 よろしくお願い致します。

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答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)) ; それ以外の環境なら自分でエンディアン調整の関数を作成する必要があります。

harapeko99
質問者

お礼

皆様ありがとうございました。良くわかりました。 ご回答を見る前に必要に迫られ、以下のような、サブ関数を作って対処しました。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)」では、そのままではうまくいかなかったであろう、と思います。(偶然やらなかったですけど)。それにしても、初心者に、皆さん親切にありがとうございました。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

long hoge = *((long*)p); です。 ファイルがレコードとして保存されているのなら、struct に読み込むのが一般的です(というか楽です)。また、long int だとはじめからわかっているのなら long で宣言した変数に直接読み込めばよいのではないでしょうか?

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.1

こんにちは、honiyonです。   後者はよく分からないので、本題だけ(^^; longint *Count; Count = (longint *)p;   printf("%d\n", Count*);   なんてどうでしょ?   Cは久しぶりなので間違ってたらすいません汗  

関連するQ&A