コグノスケ


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

link もっと前
2022年7月18日 >>> 2022年7月5日
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 この記事にコメントする



2022年7月8日

マンガ紹介 - まとめリンク

目次: マンガ紹介

一覧が欲しくなったので作りました。

5作品
  • 乙女ゲームの破滅フラグしかない悪役令嬢に転生してしまった…
  • 戦国小町苦労譚
  • 公爵令嬢の嗜み
  • はんどすたんど!
  • 球詠
1作品
  • ハコヅメ
10作品
  • うらみちお兄さん
  • 桐谷さん ちょっそれ食うんすか!?
  • じけんじゃけん
  • 天地創造デザイン部
  • ハクメイとミコチ
  • フラジャイル 病理医岸京一郎の所見
  • へんなものみっけ!
  • マージナルオペレーション
  • 魔法少女特殊戦あすか
  • 幼女戦記
2作品
  • こわもてかわもて
  • 我が驍勇(ぎょうゆう)にふるえよ天地
2作品
  • 赤髪の女商人
  • 死んだ息子の遺品に息子の嫁が入っていた話
編集者:すずき(2023/09/24 08:38)

コメント一覧

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



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

管理用メニュー

link 記事を新規作成

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

最近のコメント5件

  • link 24年5月16日
    すずきさん (05/21 11:41)
    「あー、確かにdpkg-reconfigu...」
  • link 24年5月16日
    hdkさん (05/21 08:55)
    「システム全体のlocale設定はDebi...」
  • link 24年5月17日
    すずきさん (05/20 13:16)
    「そうですねえ、普通はStandardなの...」
  • link 24年5月17日
    hdkさん (05/19 07:45)
    「なるほど、そういうことなんですね。Exc...」
  • link 24年5月17日
    すずきさん (05/19 03:41)
    「Standardだと下記の設定になってい...」

最近の記事20件

  • link 24年5月19日
    すずき (06/04 00:44)
    「[Yocto - まとめリンク] 目次: YoctoHello YoctoYoctoのセットアップスクリプトとビルドディレクト...」
  • link 24年5月31日
    すずき (06/04 00:43)
    「[Bitbakeのクラス] 目次: YoctoYocto Scarthgap(5.0.1)のメモです。前回同様、コードを読んで...」
  • link 24年5月30日
    すずき (06/04 00:35)
    「[Bitbakeのレイヤー] 目次: YoctoYocto Scarthgap(5.0.1)のメモです。Yoctoの使い方は以...」
  • link 24年5月29日
    すずき (06/04 00:09)
    「[Yoctoのビルドディレクトリとテンプレートディレクトリ] 目次: YoctoYocto Scarthgap(5.0.1)の...」
  • link 24年5月28日
    すずき (06/04 00:02)
    「[Yoctoのセットアップスクリプトとビルドディレクトリ] 目次: YoctoYocto Scarthgap(5.0.1)のメ...」
  • link 20年7月11日
    すずき (06/03 23:59)
    「[STATIONflow実績コンプリート] 目次: ゲームSTATIONflowの実績をコンプリートしました。「ラッキーセブン...」
  • link 20年7月1日
    すずき (06/03 23:59)
    「[STATIONflowランク100] 目次: ゲームSTATIONflowのランクが100になりました。何か実績と紐づいてい...」
  • link 20年6月30日
    すずき (06/03 23:59)
    「[STATIONflowの駅の評価] 目次: ゲーム以前(2020年5月28日の日記参照)STATIONflowで速度3にする...」
  • link 20年6月28日
    すずき (06/03 23:59)
    「[STATIONflowまさかの実績解除方法] 目次: ゲームSTATIONflowのしょうもない小技 その2です。実績の解除...」
  • link 20年6月27日
    すずき (06/03 23:59)
    「[STATIONflowプレイ日記] 目次: ゲームSTATIONflowの基本は理解したつもりなので、実績解除に挑んでますが...」
  • link 20年6月26日
    すずき (06/03 23:58)
    「[STATIONflow小技] 目次: ゲームSTATIONflowのしょうもない小技。将来的に、どこに駅の入り口と電車の乗り...」
  • link 20年5月28日
    すずき (06/03 23:58)
    「[STATIONflowのバグ] 目次: ゲームSTATIONflowバグってますね……。ゲーム進...」
  • link 20年5月27日
    すずき (06/03 23:58)
    「[STATIONflowランク20] 目次: ゲームゲーム進行的に1つの区切りと思われる、ランク20を超えました。駅が広くなる...」
  • link 20年5月19日
    すずき (06/03 23:58)
    「[STATIONflow始めました、超えろ、新宿駅] 目次: ゲームSteamで新たなゲームを買いました。2020年4月ローン...」
  • link 21年12月28日
    すずき (06/03 23:58)
    「[ゲーム - まとめリンク] 目次: ゲーム一覧が欲しくなったので作りました。Wizardry(囚われし亡霊の街)敵が強すぎる...」
  • link 20年7月13日
    すずき (06/03 23:57)
    「[STATIONflow - まとめリンク] 目次: ゲームに統合。...」
  • link 23年9月18日
    すずき (06/03 23:49)
    「[一覧の一覧 - まとめリンク] 一覧の一覧、まとめのまとめが欲しくなったので作りました。OS、アーキテクチャ系。目次: An...」
  • link 24年5月27日
    すずき (06/03 23:46)
    「[Hello Yocto] 目次: YoctoYoctoのメモです。なおYoctoのバージョンはScarthgap(5.0.1...」
  • link 24年5月21日
    すずき (05/23 23:19)
    「[Linux 6.1からLinux 6.6に手抜き更新したらハマった] 目次: 自宅サーバーLinux Kernelのlong...」
  • link 23年6月1日
    すずき (05/23 22:50)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
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

最終更新: 06/04 00:44