Microsoft FATファイルシステムには、ディスク上のどの "フォルダ"にどの "ファイル"があるかを表すディレクトリテーブルがあります。当分の間、これらのエントリは多くの情報を少量のビットに詰め込みました。好奇心the盛な人のためにWikiには多くの技術仕様がありますが、ここでの課題は、エントリの「単純な」デコードに焦点を当てることです。
各エントリは32バイトのバイナリワードで構成され、いくつかのセクションに分かれています。この課題に一貫性を持たせるために、MS-DOS 5.0バージョンを使用します。バイトはビッグエンディアンとして順序付けられ、バイト0x00
を左端、バイト0x1F
を右端として呼び出します。
以下は、関連するセクションの簡単な概略図と、各セクションの出力(太字)を示しています。
- 最初の11バイトはASCII形式のファイル名です(これが有名な8.3ファイル名の由来です-ファイル名に8バイト、拡張子に3バイト)。これらは単純なASCIIエンコーディングであり、ピリオド(。)を含むASCIIとして出力する必要があります。
- 注:8部分と3部分の両方にスペースを埋めて、完全な長さのエントリを作成します。出力はスペースを無視する必要があります(つまり、出力しないでください)。
- ファイル拡張子は空(つまり、すべてのスペース)である場合があります。その場合、出力はドットを出力しません。
- ASCIIは下位7ビットのみを使用するため、バイトにはすべて先頭に
0
。が付きます。
- 次のバイト(0x0b)は、次のビットマスクです。
- 0x01読み取り専用-出力RO
- 0x02非表示-出力H
- 0x04システム-出力S
- 0x08ボリュームラベル-出力VL。ファイルサイズ(以下)は、実際のエントリに関係なく0として出力される必要があります。
- 0x10サブディレクトリ-出力SD。ファイルサイズ(以下)は、実際のエントリに関係なく0として出力される必要があります。
- 0x20アーカイブ-出力A
- 0x40デバイス-このチャレンジでは無視されます。
- 0x80予約済み-このチャレンジでは無視されます。
- これはビットマスクであるため、複数のフラグが可能です-適用可能なすべての出力は、任意の順序で連結する必要があります。例えば、
0xff
とすることができるROHSVLSDA
(または他の任意の組み合わせ)。
- 次の2バイト(0x0cおよび0x0d)は、MS-DOS 5.0では使用されません。
- 次の2バイト(0x0eおよび0x0f)は、次の作成時間です。
- ビット15〜11は、24時間形式の時間である-出力00に23
- ビット10から5は分である-出力00に59
- ビット4から0は秒/ 2です-出力00から58(秒は2秒の解像度のみであることに注意してください)
- 明確にするために:
hhhhhmmmmmmsssss
ビッグエンディアンで書かれたとき。
- 次の2バイト(0x10および0x11)は、次の作成日です。
- ビット15から9は年です- 最大2107で1980を出力します
0
127
- ビット8から5は月です-出力1から12(先行ゼロの有無にかかわらず)
- ビット4から0は日-出力0から31(先行ゼロの有無にかかわらず)
- 明確にするために:
yyyyyyymmmmddddd
ビッグエンディアンで書かれたとき。
- ビット15から9は年です- 最大2107で1980を出力します
- 次の2バイト(0x12および0x13)は最終アクセス日です。MS-DOS 5.0で使用されていますが、この課題ではこの部分を無視しています。
- 次の2バイト(0x14および0x15)は、MS-DOS 5.0では使用されません。
- 次の2バイト(0x16および0x17)は最終更新時刻であり、上記の作成時刻と同じ形式に従います。
- 次の2バイト(0x18と0x19)は最終更新日で、上記の作成日と同じ形式に従います。
- 次の2バイト(0x1aおよび0x1b)は、ディスク上のファイルのクラスターの場所です。この課題ではこの部分を無視しています。
- 最後の4バイト(0x1c、0x1d、0x1e、および0x1f)は、VLまたはSDフラグが設定されている(上記)場合を除き、符号なし整数として出力されるファイルサイズです。
0
視覚的表現
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
入力
- 便利な形式の単一の32バイトワード(256ビット)。
- これは、文字列としてかもしれない
1
と0
、いくつかの符号なしとしてint
S、ブール値のアレイ、等 - 入力に使用している形式を回答で指定してください。
- 言語が入力を受け取る唯一の方法でない限り、複数の入力(つまり、関連するバイトサイズに事前に分割された配列)を取ることはできません。入力の解析は課題の一部です。
- これは、文字列としてかもしれない
- 入力が有効であると想定できます(たとえば、日付が有効であることを確認するために日付チェックを実行する必要はありません)。
- 未使用のバイトは、それらが存在する限り、all
0
、all1
などになります。以下の例で0
は、未使用のバイトにすべてを使用しました。
出力
画面に印刷するか、次のいずれかを返します。
- ASCII文字列としてのファイル名
- ASCII文字列としてのファイル属性
- 適切な区切り記号(コロン、スラッシュ、コンポーネントを区別するもの)を使用した作成時間と作成日
- 修正された時刻と修正された日付、適切な区切り記号付き
- ファイルサイズ
出力は、スペースで区切られた、または改行で区切られた単一の文字列、配列内の個別の要素などになります。出力のフォーマット方法を回答で指定してください。
ルール
- 標準のI / O形式が受け入れられます。
- 完全なプログラムまたは機能のいずれかが受け入れられます。
- 標準的な抜け穴は禁止されています。
- これはcode-golfであるため、通常のゴルフルールがすべて適用され、最短のコードが優先されます。
- この機能を正確に実行するビルトインは禁止されています。
例
0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000
programm.ing HS 20:18:08 2016/06/20 20:18:08 2016/06/20 53248
0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001
ppcg SDS 11:43:24 2010/12/31 20:18:08 2016/06/20 0
SD S
有効なフラグが設定されますか?