コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2022年7月18日 >>> 2022年7月9日
link もっと後

2022年7月18日

GNU tarのアーカイブ圧縮方式の判定

GNU tarのxオプションは圧縮されたtarでも正しく展開してくれます。圧縮方法はgzip, bzip, xz, ... など複数存在しますが、どのように判定しているんでしょう?まさか拡張子でしょうか?

こういうときにOSSは便利です。ソースコードを見ればわかるはず。バージョンはどれでも仕組み自体は同じだと思いますが、とりあえず最新版リリースGNU tar 1.34にしました。gitリポジトリへのリンクも貼っておきます。

マジックヘッダの定義部分

// src/buffer.c

/* Compression detection */

enum compress_type {
  ct_none,             /* Unknown compression type */
  ct_tar,              /* Plain tar file */
  ct_compress,
  ct_gzip,
  ct_bzip2,
  ct_lzip,
  ct_lzma,
  ct_lzop,
  ct_xz,
  ct_zstd
};

static enum compress_type archive_compression_type = ct_none;

struct zip_magic
{
  enum compress_type type;
  size_t length;
  char const *magic;
};

struct zip_program
{
  enum compress_type type;
  char const *program;
  char const *option;
};

static struct zip_magic const magic[] = {
  { ct_none,     0, 0 },
  { ct_tar,      0, 0 },
  { ct_compress, 2, "\037\235" },
  { ct_gzip,     2, "\037\213" },
  { ct_bzip2,    3, "BZh" },
  { ct_lzip,     4, "LZIP" },
  { ct_lzma,     6, "\xFFLZMA" },
  { ct_lzop,     4, "\211LZO" },
  { ct_xz,       6, "\xFD" "7zXZ" },
  { ct_zstd,     4, "\x28\xB5\x2F\xFD" },
};

各圧縮方式に固有のマジックヘッダを定義している部分がありました。さすがに拡張子などという雑な判定ではなさそうです。そりゃそうか。

マジックヘッダを調べる関数

// src/buffer.c

/* Check if the file ARCHIVE is a compressed archive. */
static enum compress_type
check_compressed_archive (bool *pshort)
{
  struct zip_magic const *p;
  bool sfr;
  bool temp;

  if (!pshort)
    pshort = &temp;

  /* Prepare global data needed for find_next_block: */
  record_end = record_start; /* set up for 1st record = # 0 */
  sfr = read_full_records;
  read_full_records = true; /* Suppress fatal error on reading a partial
                               record */
  *pshort = find_next_block () == 0;

  /* Restore global values */
  read_full_records = sfr;

  if (record_start != record_end /* no files smaller than BLOCKSIZE */
      && (strcmp (record_start->header.magic, TMAGIC) == 0
          || strcmp (record_start->buffer + offsetof (struct posix_header,
                                                      magic),
                     OLDGNU_MAGIC) == 0)
      && tar_checksum (record_start, true) == HEADER_SUCCESS)
    /* Probably a valid header */
    return ct_tar;

  for (p = magic + 2; p < magic + NMAGIC; p++)    //★★magicはさきほど示したコードで定義していた配列★★
    if (memcmp (record_start->buffer, p->magic, p->length) == 0)    //★★ここで比較★★
      return p->type;

  return ct_none;
}

各圧縮方式に固有のバイナリ列が存在するか?をmemcmp() で見ています。結構シンプルな仕組みですね。

編集者:すずき(2022/08/21 03:05)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2022年7月13日

Might and Magic Book One TAS US版、更新

目次: Might and Magicファミコン版

Might and Magic Book One TAS US版をさらに6秒くらい短縮(7:32.39 → 7:25.80)しました(ニコニコ動画へのリンク)。

キーカードを後回し
ダスクの町でキーカードを作成する場合、ゴロスの目玉+キーカードの2つを作る必要があります。しかしゴロスの目玉は7回使用したら(アストラル世界、聖域に入る手前)要らないこと、キーカードはゴロスの目玉からバグ技1回で生成できることを考慮すれば、ダスクの町でゴロスの目玉だけを作って、要らなくなったタイミングでキーカードに変換する方が早いです。
メッセージを減らす
ゴロスの目玉+キーカードを作る際は、魔力のオイルを2つ使い切る(つまり2回USELESS! メッセージを見ることになる)必要がありました。が、今回のチャートですとゴロスの目玉だけ作れば良いので、メッセージ1回分を回避できます。

TASVideosに再投稿するなら何かもう1つくらいは改善してから送りたいですが、良いアイデアが思いつかないです……。

編集者:すずき(2023/08/20 03:30)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2022年7月18日 >>> 2022年7月9日
link もっと後

管理用メニュー

link 記事を新規作成

<2022>
<<<07>>>
-----12
3456789
10111213141516
17181920212223
24252627282930
31------

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20