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

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

新規登録して質問してみよう
ただいま回答率
85.47%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

3711閲覧

ファイルを2進数(1ビット単位)で読み書きする方法がわかりません

namasute_tarou

総合スコア1

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/10/04 16:11

編集2020/10/08 08:36

前提・実現したいこと

MatlabかPythonでファイルを2進数(01)で読み書きするプログラムが作りたいです。
ここに質問の内容を詳しく書いてください。
情報埋め込みに関するプログラムを作っています。
そのために、埋め込みたいファイルを2進数で取得する必要があります。
埋め込み後に戻す際、2進数(01ビット)から埋め込み前と同じ状態のファイルを作る必要があります。
現在は、バイナリ16進数にて読み込み、2進数に変換していますが、01のビットのキリが良くないと2進数に変換した際に余分な0が含まれていると思います。
そのため、16進数に戻してファイルを再構築しても埋め込み前のオリジナルデータと一致しないと考えられます。
これらを解決するために、1bit単位でファイルの読み書きをする方法を教えていただきたいです。
もしくは検索すると良いことばなどを教えていただけますでしょうか。
よろしくお願いします。

(追記)
ご回答ありがとうございます。
少々考えてから書かせていただきます。
プログラムは見せれる部分を用意できれば書きたいと思います。
みなさんありがとうございます。

(追記2)
ファイルの読み書きがビット単位と勘違いしていたようで、実際はバイト以上の単位なんですね。知識がない人間の文章から推測していただき、皆様ありがとうございます。
埋込むデータのファイルがおそらくバイト単位となるので問題ないようです。
バイナリ読み込みにより8ビットずつ16進数で読み込まれ、2進数に変換し1ビットずつ埋込みます。
埋込みは省略して、この2進数の情報を16進数に戻し、ファイルを構成すると元に戻らないのではないかと思っていましたが、勘違いのようです。お騒がせしてすみませんでした。
ありがとうございます。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

16進数のファイル読み込みから2進数に変換したが、元ファイルと同等のファイルを構成できない。(変換時の余分な01のため。)

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

Matlab2004年

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

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

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

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

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

tiitoi

2020/10/04 18:22 編集

「2進数で読み書きする」の意味がよくわからないです。 2進数、16進数は数値の表記法の違いでしかなく、表す値は同じではないでしょうか?
shiracamus

2020/10/04 20:04 編集

ビット単位では読み込めません。 バイト単位で読み込んで、自分でビット単位に変換しながら処理しなければなりません。 まずはバイト単位で読みだすプログラムを作ってみてください。ネット検索すればいくらでもサンプルプログラムが見つかります。 そのあと、ビット単位で読みだす関数を作ってみるといいでしょう。 がんばってください。
otn

2020/10/05 01:32

多分用語の使い方がおかしいので、コードを見ないと何とも言えません。
ikadzuchi

2020/10/06 01:06

「情報埋め込みに関する」だけでは何がしたいのか分かりません。 具体的に、どのようなファイルに、どのような方法で、何のデータを埋め込むのですか?
guest

回答4

0

Windowsにしても、Linuxにしても大抵のファイルシステムは、バイト(8bit)単位での読み書きしかできません。
多分、端数というのは、8bitに足りない部分が、8bitの上位なのか、下位なのかの問題ではないかと思われます。
すでにコメントが付いていますが、参考までに。

投稿2020/10/05 12:10

pepperleaf

総合スコア6383

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

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

0

ベストアンサー

ファイルが1バイト単位/1ビット単位で読み書きできると勘違いしているようですが、ディスク上のファイルはもっと大きい単位(512バイトとか4096バイトとか)で読み書きしています。
OSやファイルシステムがファイル長を1バイト単位で管理しており、OSを介してアクセスしているプログラムからは1バイト単位でアクセスできているように見えるだけです。
私の知っている限りだとビット単位でファイル長を管理しているファイルシステムはありませんので、どうしても必要ならば、そういうファイルシステムを自分で作る必要があります。
しかし、データの有効ビット長が8の整数倍でなければ、自分でファイル内に有効ビット長を管理すればいいだけではないですか?
(例えば各レコードの先頭に有効バイト長と末尾のバイトの有効ビット長を書いておく)

投稿2020/10/06 02:26

編集2020/10/08 09:25
sage

総合スコア1216

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

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

0

「情報埋め込み」の詳細が分かりませんが、つまりは例えば元データで8ビットあったところに7ビット書いて残りをそのままにしたいというようなことだと理解します。
そのような方法はありません。
1バイト単位で読んで書き換えて、ビットがずれたら後続のすべてのバイトを書き換える他ありません。

投稿2020/10/06 01:05

ikadzuchi

総合スコア3047

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

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

0

現在は、バイナリ16進数にて読み込み、2進数に変換していますが、01のビットのキリが良くないと2進数に変換した際に余分な0が含まれていると思います。

そのため、16進数に戻してファイルを再構築しても埋め込み前のオリジナルデータと一致しないと考えられます。

それはありえません。

その一致しないという現在のコードを提示しましょう。

投稿2020/10/04 22:00

y_waiwai

総合スコア87784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問