掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28651

6byteデータの計算
投稿者---lucia(2006/11/01 15:46:22)


バイナリファイルから6byteの16進データを読込み、100で除算したいのですが32bit環境ではlong型でも4byteしか格納できないので読込んだデータを格納するエリアについて困っています。
何か方法があれば教えてください。
コンパイラはborlandです。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:6byteデータの計算 28652 nop 2006/11/01 15:49:23
<子記事> Re:6byteデータの計算 28677 かずま 2006/11/02 11:26:19


No.28652

Re:6byteデータの計算
投稿者---nop(2006/11/01 15:49:23)


>バイナリファイルから6byteの16進データを読込み、100で除算したい

その6バイトのデータはどの様な形式ですか?
ファイルデータのエンディアンはどの様になっていますか?


この投稿にコメントする

削除パスワード

No.28653

Re:6byteデータの計算
投稿者---lucia(2006/11/01 15:56:19)


>>バイナリファイルから6byteの16進データを読込み、100で除算したい
>
>その6バイトのデータはどの様な形式ですか?
>ファイルデータのエンディアンはどの様になっていますか?
データは 08 3A A1 7E 01 00 このようになっていて
ファイルはリトルエンディアンです。


この投稿にコメントする

削除パスワード

No.28654

Re:6byteデータの計算
投稿者---nop(2006/11/01 16:18:18)


>6byteの16進データ
>データは 08 3A A1 7E 01 00 このようになっていて

この二行は同じ事を言っている訳ですが、
回答者として欲しいのは、
その6バイトをどの様に扱いたいのか?
と言うことです。

6バイトのデータが並んでいることは

>6byteの16進データ

の記述で判りますが、その6バイトをどう見るのですか?

# この6バイトの固まりを単純な整数値として見る、
# と言う解釈でよろしいか?


この投稿にコメントする

削除パスワード

No.28655

Re:6byteデータの計算
投稿者---lucia(2006/11/01 16:21:48)


>>6byteの16進データ
>>データは 08 3A A1 7E 01 00 このようになっていて
>
>この二行は同じ事を言っている訳ですが、
>回答者として欲しいのは、
>その6バイトをどの様に扱いたいのか?
>と言うことです。
>
>6バイトのデータが並んでいることは
>
>>6byteの16進データ
>
>の記述で判りますが、その6バイトをどう見るのですか?
>
># この6バイトの固まりを単純な整数値として見る、
># と言う解釈でよろしいか?
その解釈の通りです。


この投稿にコメントする

削除パスワード

No.28657

Re:6byteデータの計算
投稿者---nop(2006/11/01 16:53:42)


とりあえず、引用は最小限にして下さい。

本題ですが、方法はいくつかあります。

1. long longがを使用する (long long 型が使用できる場合のみ)
2. double型を使用する (整数部が6バイト分以上の精度がある場合のみ)
3. 自前で多バイト長演算を実装する


この投稿にコメントする

削除パスワード

No.28659

Re:6byteデータの計算
投稿者---Blue(2006/11/01 17:03:13)


>1. long longがを使用する (long long 型が使用できる場合のみ)
こんな過去ログがありました。

No.1237 int型以上の数値
http://f4.aaa.livedoor.jp/~pointc/log1237.html


この投稿にコメントする

削除パスワード

No.28661

Re:6byteデータの計算
投稿者---lucia(2006/11/01 17:25:02)


>1. long longがを使用する (long long 型が使用できる場合のみ)
>2. double型を使用する (整数部が6バイト分以上の精度がある場合のみ)
>3. 自前で多バイト長演算を実装する
nop様・Blue様回答ありがとうございます。
long long型を試してみたのですがどうやら対応していないようです。
3. 自前で多バイト長演算を実装するというのは具体的に、
どのようなことをすればよいのでしょうか?



この投稿にコメントする

削除パスワード

No.28675

Re:6byteデータの計算
投稿者---yoh2(2006/11/02 01:15:54)


100で割ることだけを考えるなら、6バイト整数を上位部分と下位部分に分けて
(つまり2つの変数に分けて) 計算するのが手っ取り早いです。
結果も4バイトに収まらないので2つに分ける必要があります。
割り振りは上位4バイト、下位2バイト、または上位3バイト、下位3バイトとするのが
よいでしょう。
(やってみれば分かりますが、上位2バイト、下位4バイトだとうまくいきません)

で、分割された2つの整数がそれぞれひとつの桁であると見立てて、筆算の要領で
割り算をすると計算できます。
疑似コードで書くとこんな感じ。(未テスト)
  商の上位部 = 上位部 / 100;
  繰り下がり = 上位部 % 100 * N;
  商の下位部 = (繰り下がり + 下位部) / 100;
  余り = (繰り下がり + 下位部) % 100;
(Nは下位桁の最大数+1; 下位部が2バイトなら65536、3バイトなら16777216)

なお、汎用性を求めるなら、2バイト×3に分けるのもよいかも。計算の手間は増えますが。


この投稿にコメントする

削除パスワード

No.28676

Re:6byteデータの計算
投稿者---lucia(2006/11/02 09:41:51)


>なお、汎用性を求めるなら、2バイト×3に分けるのもよいかも。計算の手間は増えますが。
計算した上位と下位を統合するにはどのようにすればよいのですか?


この投稿にコメントする

削除パスワード

No.28691

Re:6byteデータの計算
投稿者---yoh2(2006/11/03 02:33:55)


>計算した上位と下位を統合するにはどのようにすればよいのですか?

最終的に64ビット整数を使うようにしたようですので、こっちはもう必要ないかも
しれませんが簡単に。

内部計算では基本的に統合といったことはせず、バラのまま扱います。
で、ファイルに書き出したりするときは上位と下位の2回に分けて書き出します。
10進数文字列に変換する場合は、標準のsprintf()等は使えませんので、100で割るのと
同じ要領で10で繰り返し割って文字列に変換します。


この投稿にコメントする

削除パスワード

No.28677

Re:6byteデータの計算
投稿者---かずま(2006/11/02 11:26:19)


> コンパイラはborlandです。

long long に相当する __int64 という型があります。
printf では "%lld" の代わりに "%I64d" が使えます。


この投稿にコメントする

削除パスワード

No.28678

Re:6byteデータの計算
投稿者---lucia(2006/11/02 12:11:59)


>printf では "%lld" の代わりに "%I64d" が使えます。
記述例など書いていただければありがたいです。


この投稿にコメントする

削除パスワード

No.28680

Re:6byteデータの計算
投稿者---nop(2006/11/02 12:21:19)


>記述例など書いていただければありがたいです。

ググればいくらでも出てくるかと。
聞くばかりではなく、自分で調べる癖を!


この投稿にコメントする

削除パスワード

No.28681

Re:6byteデータの計算
投稿者---lucia(2006/11/02 13:08:55)


>ググればいくらでも出てくるかと。
>聞くばかりではなく、自分で調べる癖を!
int64を使用することによって問題が解決しました。
回答をいただいた皆さんありがとうございました。
nopさま確かに自分で調べるべきでした。ご指摘ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧