iT邦幫忙

0

將Excel的16進位字串輸出成Binary檔

  • 分享至 

  • xImage
  •  

使用情境如下圖,我已經在Excel中做好一串16進字字串,想要輸出成.bin檔(如第二張圖)

https://ithelp.ithome.com.tw/upload/images/20230703/201610522dOSxzMHIs.png
https://ithelp.ithome.com.tw/upload/images/20230703/20161052LVEVDjDN7L.png

最理想是可以直接複製貼上,有一些文字編輯器可以做到,但這樣移植性太差,要分享給其他人用的時候太麻煩了,後來找到這個線上工具 HEX to file(binary) Converter 還不錯用,還會自動濾掉空格、逗號、0x等等多餘的字元,但需要 複製文字→開網頁→貼上→轉換→存檔→開檔 好幾個步驟才能得到結果,還是有點麻煩。

後來注意到網站下面有附上原始碼以及執行檔,於是花了點時間研究如何把它跟Excel對接。這個執行檔的功能是輸入.txt並輸出.bin,無奈功力不夠沒能成功改成直接貼上文字就能運作,於是退而求其次,使用Excel VBA製作一個中繼的文字檔,並操作CMD將文字檔輸入exe,得到我要的檔案並直接開啟。

以下是VBA的程式,製作按鈕及設定巨集的過程不在這邊贅述

Sub 按鈕284_Click()
    Dim MYstr As String
    
    For Each c In Range("C3:R18")
        MYstr = MYstr + c.Value
    Next c
    
    Open ThisWorkbook.Path & "\BINtemp.txt" For Output As #1
        Print #1, MYstr
    Close #1
    
    CMD = "cmd /k cd " & ThisWorkbook.Path & _
            "&& .\hex2bin.exe --i BINtemp.txt --o OUT.bin" & _
            "&& del BINtemp.txt" & _
            "&& start .\OUT.bin" & _
            "&& exit"
    
    Dim myret
    myret = Shell(CMD, 1)
End Sub

分成三個部分:

  1. 使用for迴圈將文字範圍組成字串MYstr,順序是左上一列一列到右下
  2. 新增並開啟BINtemp.txt檔作為中繼檔(若已存在則覆蓋),將MYstr寫入,完成後關閉檔案
  3. 寫好腳本CMD,再用Shell()指令執行,說明一下其中的細節:
    • cmd :執行CMD,通常都會有這個變數
    • /k :執行時會顯示CMD視窗(讓使用者看得出有在執行)
    • & _ :VBA程式分行符號
    • && :CMD多行指令符號
    • 第二行hex2bin.exe的指令,格式為「--i 輸入路徑 --o 輸出路徑及檔名」
    • del :刪除檔案
    • start :以新視窗執行(否則會直接在CMD中執行)
    • exit :關閉CMD

以上

========================= 2023/10/13 更新 =========================
最近發現上面的寫法在碰到路徑名稱有空格時會報錯,解法是在路徑外面加上雙引號「"」,寫法如下:

    CMD = "cmd /k cd " & """" & ThisWorkbook.path & """" & _
            "&& .\hex2bin.exe --i BINtemp.txt --o OPtable.bin" & _
            "&& del BINtemp.txt" & _
            "&& start .\OPtable.bin" & _
            "&& exit"

其中有2組4個連續的雙引號,前後2個將中間的2個表示為字串(VBA),到了CMD會將中間2個雙引號解釋為1個雙引號,希望下面的說明可以幫助理解:

"cd " & """" & "folder 1/file" & """" <= 完整程式的寫法
cd ""folder 1/file"" <= VBA組出來的字串,也就是傳到CMD的字串
cd "folder 1/file" <= CMD執行的指令,其中路徑有空格,加了雙引號才能正常執行

========================= 2023/11/14 更新 =========================
今天又發現一個bug,原本CMD打開來的路徑是在C槽,若Excel路徑是放在D槽中,原本的程式會cd不到D槽造成路徑錯誤,而修正方法是在 cd之後加上 \d 便可解決,經測試在C槽及D槽下都能正常使用。修改後的指令如下:

    CMD = "cmd /k cd /d" & """" & ThisWorkbook.path & """" & _
            "&& .\hex2bin.exe --i BINtemp.txt --o OPtable.bin" & _
            "&& del BINtemp.txt" & _
            "&& start .\OPtable.bin" & _
            "&& exit"

沒幾行程式也能有這麼多bug,希望不會再有更新了。

========================= 2024/01/23 更新 =========================
感謝下面大大的建議,多掛一個exe的確蠻麻煩的,直接用VBA解決就好了,結合之後程式碼如下:

Sub 產生BIN檔()
    Dim row
    Dim col
    Dim i
    Dim handle As Long
    
    handle = FreeFile
    Open ThisWorkbook.Path & "\BIN_File.bin" For Binary As #handle

    For i = 0 To 255
        row = Int(i / 16)
        col = i Mod 16
        Put #handle, , CByte("&H" & Range("J3").Offset(row, col)) 
    Next i
    Close #handle

    CMD = "cmd /k cd /d" & """" & ThisWorkbook.Path & """" & _
          "&& start .\BIN_File.bin" & _
          "&& exit"
      
    Dim myret
    myret = Shell(CMD, 1)

End Sub

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

2
海綿寶寶
iT邦大神 1 級 ‧ 2023-07-04 13:44:56

都寫 VBA 了
乾脆 VBA 到底

Hex to file

我要留言

立即登入留言