HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0517
Hpeekで4バイトデータを扱うことは可能か9解決


H

リンク

2020/5/17(Sun) 19:12:08|NO.90580

画像の縦横サイズの4バイト情報を取得するときにlpeekが良いようなのですが
peekで一バイトデータを4つ取り出し結合させることは可能でしょうか?



この記事に返信する


あらや

リンク

2020/5/17(Sun) 19:53:10|NO.90581

>画像の縦横サイズの4バイト情報
この辺りがちょっとよくわかりませんが
ファイル内のヘッダ情報を直接取得するというような意味だと解釈させていただきます。

いくつか方法はありますが可能です。

// pokeを併用 data = 0; // 取得用変数のリセット poke data, 0, peek(file, 5); // ヘッダ情報から1バイト取得しdataの最初に書き込み(peekのインデックスは適当) poke data, 1, peek(file, 6); // ヘッダ情報から1バイト取得しdataの2番目に書き込み poke data, 2, peek(file, 7); // ヘッダ情報から1バイト取得しdataの3番目に書き込み poke data, 3, peek(file, 8); // ヘッダ情報から1バイト取得しdataの4番目に書き込み



pokeを使わない方法では

// ビット演算で論理和を使用(『|』ではなく通常の加算『+』でも可) data = 0; // 取得用変数のリセット data = (peek(file, 8) << 24) | (peek(file, 7) << 16) | (peek(file, 6) << 8) | peek(file, 5);



そもそもpeekを使わずにmemcpyなどでも可能ですが、
4バイトで固定されているのならば、やはりlpeekが一番手っ取り早いかと。



H

リンク

2020/5/17(Sun) 22:07:58|NO.90582

あらやさんどうもありがとうございます。
↓このところがよくわからないのですが・・

data = (peek(file, 8) << 24) | (peek(file, 7) << 16) | (peek(file, 6) << 8) | peek(file, 5);
ビットシフトする理由は何ですか?



あらや

リンク

2020/5/17(Sun) 22:55:16|NO.90583

>ビットシフトする理由は何ですか?
変数dataは32ビット(4バイト)の整数型です。

peekで取得する値は8ビット(1バイト)なので
4バイト分の数値を1つの変数に入れる為の処置と考えてください。

ビットやバイトだとわかりにくいと思うので
10進数で例えさせていただくと

1234

この数値を1文字ずつ取り出す(peek)と

1、2、3、4

この4つが取り出せます。
取り出した4つの数値から元の値を取得するには

(1 * 1000) + (2 * 100) + (3 * 10) + 4 = 1234

このような計算式になります。
それぞれ桁に合わせて10倍、100倍、1000倍していますが
これがビットシフトと同じ意味です。

ビットシフト(桁揃え)無しで加算すると

1 + 2 + 3 + 4 = 10 (桁揃えしないで加算した場合)

このように元の数値とは全く違う数値になってしまうので
桁に合わせてビットシフトしているわけです。


長々と説明させていただきましたが
最初のpokeを使った例でインデックスをそれぞれ0〜3にしていますが
意味としてはそれと同じです。

poke data, 0 // 変数dataのインデックス0番目は『8ビット × 0 = 0ビットシフト』するのと同じ poke data, 1 // 変数dataのインデックス1番目は『8ビット × 1 = 8ビットシフト』するのと同じ poke data, 2 // 変数dataのインデックス2番目は『8ビット × 2 = 16ビットシフト』するのと同じ poke data, 3 // 変数dataのインデックス3番目は『8ビット × 3 = 24ビットシフト』するのと同じ



H

リンク

2020/5/18(Mon) 07:33:36|NO.90588

ありがとうございます。難しいですね。
*10が<<8と同じ意味なんですね。
<<8は256倍なのに*10と同じなのがよくわからないです。(^^;)
あと論理和の|が+と同義で使えるのはびっくりです。
C言語の||とは違いますよね?
もうひとつ疑問が湧いたのですが論理積の&は- + * /のどれと同義になるのでしょうか?



あらや

リンク

2020/5/18(Mon) 14:38:13|NO.90592

><<8は256倍なのに*10と同じなのがよくわからないです。(^^;)
あくまでもビット(2進数)の計算を10進数で『例えた』だけなので
8ビットシフトと10倍が同じという訳ではありません。

ビット(2進数)で説明させていただくと
数字は適当ですが、

‭00000001 01100101 11000011 10010001(長いので8ビットごとに区切っています)‬

これが4バイト(32ビット)の数値です。
10進数の例のようにこれをpeekで1バイト(8ビット)ずつ取り出すと

‭00000001
01100101
11000011
10010001

この4つの数値が取り出せます。
ここから元の数値を求めるために桁を元の形に合わせる必要があります。

00000001 00000000 00000000 00000000(24ビットシフト)
01100101 00000000 00000000(16ビットシフト)
11000011 00000000(8ビットシフト)
10010001(ビットシフト無し)

表示がズレているかもしれませんが、
これらを足すと元の数値になるのはわかると思います。

>あと論理和の|が+と同義で使えるのはびっくりです。
誤解させてしまって申し訳ありません。
厳密には|と+は全く意味が違います。

論理演算は2進数の1桁ごとに演算されるので

0 | 0 = 0(0と0は通常の加算と同じく0)

0 | 1 = 1(0と1は通常の加算と同じく1)

1 | 0 = 1(1と0も通常の加算と同じく1)

1 | 1 = 1(通常の2進数の加算だと1+1は10になるが、論理演算では桁が繰り上がる事は無いので1)

このように微妙に異なる結果になります。
数値が両方1の場合のみ|と+の結果が違うのが分かると思います。
今回の場合はビットシフトしたことで、0と加算する形になるために
たまたま|が+が同じ結果になるだけです。

>論理積の&は- + * /のどれと同義になるのでしょうか?
上記の理由から論理積と同じ意味の物はありません。

・2進数で1桁だけの数値(つまり10進数で0か1の場合)
・片方の数値が(2進数でも10進数でも)完全に0の場合

この2つの場合のみ、論理積と乗算は同じ結果になります。



あらや

リンク

2020/5/18(Mon) 14:46:40|NO.90593

やはり表示がズレてしまいました。

>00000001 00000000 00000000 00000000(24ビットシフト)
>01100101 00000000 00000000(16ビットシフト)
>11000011 00000000(8ビットシフト)
>10010001(ビットシフト無し)

半角スペースで桁を合わせていたのですが消されてしまいました^^;
代わりに0を入れて

00000001 00000000 00000000 00000000(24ビットシフト)
00000000 01100101 00000000 00000000(16ビットシフト)
00000000 00000000 11000011 00000000(8ビットシフト)
00000000 00000000 00000000 10010001(ビットシフト無し)

分かりにくくなってしまった気がしますが……
このように桁を合わせています。



H

リンク

2020/5/18(Mon) 20:12:44|NO.90595

あらやさん面倒な質問にお答え頂いてほんとにありがとうございます。
大体わかりました。(^^)
そこでまた疑問なんですがなぜ縦横のサイズは4バイトデータになっているのでしょうか?
2バイトもあれば65536通りで十分足りると思うのですが上位2バイトは使用してないのでしょうか?



あらや

リンク

2020/5/18(Mon) 21:38:27|NO.90596

さすがにサイズの由来まではわかりません。。。

しかし、予想出来る範囲では……

・例えば映画館ような巨大なスクリーンに投影した場合に
2バイト程度のサイズで綺麗な映像・画像が表示できるのか。

・例えば今の技術では2バイトで充分かもしれないが
未来ではもっと高解像度の画像が必要になるのではないか。

・自分は使わないが、画像を専門にする方々が2バイト程度の画素で充分なのか。

・例えば医療関係などで詳細かつ鮮明な(レントゲンやCTなどの)画像が必要な場合に
2バイトで足りるのか。

などなど、考え始めたらキリがありませんが
簡単に言えば現在にしろ将来にしろ使い道がわからない以上
余裕を持った容量にしておきたかったのかと思います。



H

リンク

2020/5/20(Wed) 08:03:03|NO.90605

あらやさんありがとうございました。
ほんとに助かりました。(^^)



ONION software Copyright 1997-2018(c) All rights reserved.