dem ファイルから記録時のバージョン情報を取得する方法

dem ファイル内に demo(プレイを記録したリプレイ)録画時のバージョン番号が記録されている場所を見つけたので共有します。0x0C〜0x0D の 2 バイトに、エンジンのバージョン番号がリトルエンディアン(下位バイトが先)の 16bit 整数として記録されています。バイナリエディタで見える 2 バイトを逆順に並べて 16 進数として読み、10 進数に直せばバージョン番号です。例えば 2 バイトが F9 07 なら 0x07F9 = 2041 になります。

dem ファイルをバイナリエディタで開いたところ。0x0C・0x0D バイト目(この demo では F5 07)がハイライトされている

# demファイル内に、demo録画時のバージョン番号が記録されてる場所発見したので共有(ハイライトされてる場所が該当箇所)↓
# http://gyazo.com/7e3604b42ec6bfd54af099ecbdd32d6a.png
# ※実際にL4Dで読み込んでみればバージョン番号はわかることだけど以下詳細について
#
# demファイルをバイナリエディタで読み込んだときの0Cと0Dバイト目の値を、little endian -> big endianに変換して(単に値を入れ替えるだけ) それを10進数になおせばOK
#
# 実際に今日とったデモでやってみると
# 0CがF9, 0Dが07となっているので
# これをlittle endianからbig endianにすると
# 07F9になる
# 07F9を10進数に直すと2041
# この2041という値をsteam.infのPatchVersionのところに記載すればそのバージョンのデモ見れるようになる

filepath = ARGV.shift
unless filepath
    STDERR.puts "usage: demo_extract.rb <filepath>"
    exit 1
end

# read binary mode
buf = File.open(filepath, "rb"){|f| f.read }

# little endian -> big endian
bytes = 0
a = buf[0x0C].to_s(16)
b = buf[0x0D].to_s(16)
version = (b + a).hex

puts "engine version: #{version}"