第一版是針對 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也可以 支援 Lua 專案


21.2.2 – 二進位檔案

簡單的模型函式 io.inputio.output 總是會以文字模式開啟檔案(預設)。在 Unix 中,二進位檔案和文字檔案沒有差別。但在某些系統(特別是 Windows)中,必須使用特殊旗標來開啟二進位檔案。若要處理此類二進位檔案,您必須使用 io.open,並在模式字串中加上字母 `b´。

Lua 中的二進位資料處理方式類似於文字。Lua 中的字串可以包含任何位元組,函式庫中的幾乎所有函式都可以處理任意位元組。(您甚至可以對二進位資料進行模式比對,只要模式不包含零位元組即可。如果您想要比對零位元組,您可以改用類別 %z。)

通常,您可以使用 *all 模式(會讀取整個檔案)或模式 n(會讀取 n 個位元組)來讀取二進位資料。舉例來說,下列程式會將 DOS 格式的文字檔案轉換成 Unix 格式(也就是將換行符號-換行符號的順序轉換成換行符號)。它不會使用標準 I/O 檔案(stdin/stdout),因為這些檔案是以文字模式開啟的。反之,它假設輸入檔案和輸出檔案的名稱會作為程式參數提供

    local inp = assert(io.open(arg[1], "rb"))
    local out = assert(io.open(arg[2], "wb"))
    
    local data = inp:read("*all")
    data = string.gsub(data, "\r\n", "\n")
    out:write(data)
    
    assert(out:close())
您可以使用下列命令列呼叫此程式
    > lua prog.lua file.dos file.unix

再舉一個例子,下列程式會列印在二進位檔案中找到的所有字串。此程式假設字串是任何由六個或更多個有效字元組成的零終止順序,其中有效字元是模式 validchars 所接受的任何字元。在我們的範例中,這包括英數字元、標點符號和空白字元。我們使用串接和 string.rep 來建立一個模式,用來擷取所有由六個或更多個 validchars 組成的順序。模式末尾的 %z 會比對字串末尾的零位元組。

    local f = assert(io.open(arg[1], "rb"))
    local data = f:read("*all")
    local validchars = "[%w%p%s]"
    local pattern = string.rep(validchars, 6) .. "+%z"
    for w in string.gfind(data, pattern) do
      print(w)
    end

最後一個範例,下列程式會傾印二進位檔案。同樣地,第一個程式參數是輸入檔名;輸出會傳送到標準輸出。此程式會以 10 個位元組為單位讀取檔案。對於每個區塊,它會寫入每個位元組的十六進位表示法,然後將區塊寫入文字,並將控制字元改為點。

    local f = assert(io.open(arg[1], "rb"))
    local block = 10
    while true do
      local bytes = f:read(block)
      if not bytes then break end
      for b in string.gfind(bytes, ".") do
        io.write(string.format("%02X ", string.byte(b)))
      end
      io.write(string.rep("   ", block - string.len(bytes) + 1))
      io.write(string.gsub(bytes, "%c", "."), "\n")
    end
假設我們將程式儲存在名為 vip 的檔案中;如果我們將程式套用於它自己,並呼叫
    prompt> lua vip vip
它將產生類似這樣的輸出(在 Unix 機器中)
    6C 6F 63 61 6C 20 66 20 3D 20    local f = 
    61 73 73 65 72 74 28 69 6F 2E    assert(io.
    6F 70 65 6E 28 61 72 67 5B 31    open(arg[1
    5D 2C 20 22 72 62 22 29 29 0A    ], "rb")).
               ...
    22 25 63 22 2C 20 22 2E 22 29    "%c", ".")
    2C 20 22 5C 6E 22 29 0A 65 6E    , "\n").en
    64 0A                            d.