web-dev-qa-db-ja.com

md5sumコマンドのバイナリおよびテキストモード

GNU md5sumコマンドには、binaryモードとtextモードの2つのモードがあります。違いは、改行の仕方だけだと思いますキャラクターは処理されますか?

GNU/Linuxでは、2つのモードは常に同じ結果を生成するため、-bおよび-tオプションの唯一の使用は、ファイル名の前に使用されるフラグ(*または)を示すことですか?

どのような状況でモードが異なる結果を生成できますか? Windows/MacOSシステムでは? (これらのプラットフォームのバージョンは入手可能ですか?)

13
frozen-flame

GNU/Linuxでは、2つのモードは常に同じ結果を生成します

はい、明示的に。 _man md5sum_から:

注:[sic] GNUシステムでは、バイナリモードとテキストモードオプションの間に違いはありません。

これは、GNU coreutils 8.21に同梱されている_md5sum_実装からのものです。古いバージョン(8.12)にはこの通知がないことに気付きましたが、とにかく同じことが当てはまると思います。

AFAICT _md5sum_は(POSIXなどによって)正式に標準化されていませんが、さまざまな実装のさまざまなプラットフォームで利用でき、システム間で使いやすくするために、これらを相互に準拠させる努力が明らかになされています。

これに関連して、 ISO/ANSI C規格 には、ファイルにアクセスするための高レベルのストリーム関数が含まれています。標準の一部として、これらは、共有ライブラリまたはコンパイラを介してISO Cを実装するすべてのオペレーティングシステムで使用できます。ほとんどすべてのオペレーティングシステムでこれが利用可能であり(ほとんどの場合それ自体がCで記述されています)、非常に移植性の高いソフトウェアの実装に使用される一種の汎用言語です。

それが何をするかを考えると、コンパイルして任意のオペレーティングシステムで動作する_md5sum_を書くことは完全に実現可能です。これがGNU coreutilsバージョンの場合に当てはまるとは主張していませんが、前述の高レベルファイルストリーム関数の1つはfopen()です。これは、ISO Cによって、開始時に使用されるbスイッチを含めるように義務付けられています。 「バイナリファイルとして」開かれていることを示すファイル。システムが意味または必要とするものは標準で規定されていないので、存在する必要があるだけです。何らかの(any)理由があるシステムで使用できます。

Linux/POSIX/* nixスタイルのオペレーティングシステムにはそのような理由はないため、スイッチは何もしません。 fopen() のPOSIX仕様(ISO Cのスーパーセット)から:

文字「b」は無効ですが、ISO C規格への適合が許可されています。

したがって、完全に移植可能な_md5sum_実装はISO高レベルファイルストリーム関数を使用する可能性があります。これは、ISO Cのファイルにアクセスする他のメソッドがないためです(POSIX準拠のファイルを含むほとんどのプラットフォームには、独自の低レベルメソッドもあります)。 、ただし、これらはISO Cにないため、使用することはできません。また、_-b_および_-t_フラグを実装して、fopen()にファイルを読み取るときにbオプションを追加するかどうかを指定する必要があります。 。それが無意味なシステムでは、何の違いもありません。

繰り返しますが、GNUのmd5sumがそのような完全に移植可能な方法で記述されている、またはその方法から派生していると言っているわけではありませんが、明らかに、その操作性において、ある方法に準拠しようとしています。何もしないフラグがあることは、フラグがないことと同じではないことに注意してください-前者の場合、それは大丈夫であるが何もしないように指定されていますが、後者の場合、それを使用するとエラーになるか、 未定義の動作

11
goldilocks