質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

360閲覧

python3 2進数保存

Lizard_knight

総合スコア18

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/10 07:27

編集2019/06/10 07:53

python3 2進数保存

python3で値を保存するとき、以下のようにしています。

python

1a=1 2value=a.to_bytes(1, 'big') 3with open('test.bi' ,'wb') as f: 4 f.write(value) 5 6print(value) ## b'\x01'

しかし、a=1の場合、0b1を保存するだけでいいのに、byte型変換すると1byte分の情報が含まれてしまいます。
要するに、値が0,1だけの場合2進数(1bit)で保存したいのですが、どうしたらいいのでしょうか?

試したこと

python3の2進数変換

python

1i=1 2bin_str = bin(i) 3print(type(bin_str)) ## -> 0b1 (str型に変換される) 4with open('test.bi', 'wb') as f: 5 f.write(bin_num) ## str型ではerrorになる 6 7_int = int(bin_num, 2) ## int型に変換 8value = _int.to_bytes(~~) ## 結局byte型に変換してしまうはめに... 9with open('test.bi', 'wb') as f: 10 f.write(int(bin_num, 2)) ## 1byte保存する結果に

c++のようにメモリを自由に割り当てできる言語じゃないとできないのでしょうか??
誰かご教授願います( ;´Д`)

補足情報(FW/ツールのバージョンなど)

python3.5.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/06/10 07:30

Pythonについて聞きたいのであれば、紛らわしいので C++ のタグは削除してください。
Lizard_knight

2019/06/10 07:32

すみません... 訂正します。
mather

2019/06/10 07:40

再現しません。 value=a.to_bytes(1, 'big') の時点でのvalueはどうなっていますか? あるいは省略した工程はありませんか?
mather

2019/06/10 07:41

>>> a=1 >>> value=a.to_bytes(1, 'big') >>> value b'\x01'
ozwk

2019/06/10 07:41

3.6.1で試しましたがprint(value)はb'\x01'ですし、 ファイルに書かれるのも1バイトだけでした
Lizard_knight

2019/06/10 07:51

すみません、手違いで2バイト分書いてしまいました。 valueの値はb'\x01'の1byteで出力されました。 これをa=1の場合、1bitで保存する方法はあるのでしょうか?という質問です。 ややこしくなってすみません...
ozwk

2019/06/10 07:58 編集

1bitのデータを8個ずつにまとめて1byte単位にすればいいとかそういう話でなく?
Lizard_knight

2019/06/10 08:06

データが8の倍数でない時があるので、出来れば1bitずつの保存が望ましいです!
tiitoi

2019/06/10 08:07 編集

C++ でも Python でもファイルの保存はバイト単位でしかできないと思います。 1bit のデータを保存する場合でも1バイトの保存しか不可能だと思いますよ。
Lizard_knight

2019/06/10 08:11

@tiitoiさん そうなんですね。勉強になります。諦めてバイトで保存できるようにしてみます。 @ozwkさん、@matherさんもありがとうございました。
tiitoi

2019/06/10 08:11

例えば、15bit 分の情報を保存するとして、2bytes (16bits) のバイナリとして保存するのではなにか問題があるのでしょうか?
Lizard_knight

2019/06/10 08:18

0値を0、0以上を1としたマスクデータの生成を考えています。 例えば、000001001 という9bitのデータを後ろに7bit分0を付け加えると元々9bitのデータが16bitに拡張されてしまうので、データの削除処理と冗長な情報量を保存してしまうといった点ですかね...
hayataka2049

2019/06/10 08:22

ストレージの広さを考えれば多少の冗長さは問題ないですし、どうしても気になるなら圧縮だってできますよ
Lizard_knight

2019/06/10 08:26

@hayataka2049さん 圧縮についてちょっと調べてみます!
quickquip

2019/06/10 08:26

1バイトのファイルを作っても、ディスク上は4kバイトといったブロック1つを使ってしまうので(4kバイトの部分はファイルシステムで変わります)、小さいファイルをたくさん作ろうとする方が実際は無駄なことになりますよ。 回答じゃないのでここで。
hayataka2049

2019/06/10 08:32 編集

圧縮する意味があるとしてもMBの単位を越えてからだとコメントしておきます・・・ # 真面目な話、よほどでかいマスクを作るつもりでなければ何も考えず突っ込んで問題ないと思うのですが……
Lizard_knight

2019/06/10 08:33

@quiquiさん そうなんですね!またしても勉強になります! ハードウェアの勉強もしておきます。
Lizard_knight

2019/06/10 08:36

@hayataka2049さん 多分、kbyteくらいの規模だと思います( 一一)
guest

回答2

0

ベストアンサー

8bitごとにまとめて端数は0または1で埋めときます。
総bit数が決まってないならデータの先頭に何個0埋めしたか書いとけばいいです。

投稿2019/06/10 08:18

ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2019/06/10 08:25 編集

まあ記憶領域が数百GBとか数TBとかいう時代なんで こんなこと気にせず1フラグbyte単位で書いてもいい気がします
Lizard_knight

2019/06/10 08:39 編集

@ozwkさん 回答ありがとうございます。 早速、byte単位に拡張して試してみます!
guest

0

ファイルはバイトの列なので、バイトの整数倍しか書けません。
struct.packもバイト単位ですね。

ビット単位で処理するなら、ビット演算をしてバイトに情報を詰め込むしか無いのでは?

投稿2019/06/10 12:55

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lizard_knight

2019/06/11 18:14

回答ありがとうございます! バイト単位でしか保存できないんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問