原來JavaScript也可以做1個byte的操作
最近有一些需要用利用強大的pc做簡單的binary decoder的需求。
這件事情直覺想起來真的是痛苦無比啊,認真說我還真不知道把float要怎麼做bitwise運算。
不過既然打了這篇﹐就是有簡單的做法可以分享的意思啦。
其實跟c操作起來感受差別不大,在c習慣把東西裝在char*裡面,然後視情況需要在用各種不同的型態轉換把值取出來這樣。
JS也大概是如此。
基本上會用到的東西大概就3個,ArrayBuffer、DataView和Typed Array。
- ArrayBuffer就是實際的儲存空間,read-only的一個物件,長度是byteLength,你只能初始化它的大小,值要用另外兩個東西get/set
- DataView,一個可以任意存取ArrayBuffer的介面型物件,一次set/get 1個uint8/int8/uint16/int16/uint32/int32/float32/float64。
- Typed Array,跟DataView類似,但他就是Array style的存取方式。我個人比較喜歡用Typed Array用起來跟unsigned char有87%像。
以下使用
- Microsoft Windows [Version 10.0.17134.407]
- gcc (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
- node v8.11.1
多說無益直接示範如何把一坨binary decode
以下為產生測資的c code,gcc 直接編譯執行即可產生flash.txt
1 |
|
以下為JavaScript寫的decoder,可以直接吃上面code生出來的測資。
把讀檔的部分拿掉應該是可以直上瀏覽器
1 | const fs = require('fs'); |
不得不說用JavaScript處理binary真的舒服的。
參考資料:
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/DataView
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Typed_arrays