最后更新与2023-05-09:doc二进制太复杂了,放弃。
创建于2023-05-05
虽然说是
Golang
,其实看文档的话,和语言无关
xls解析已经有人做了,这里是github源码(github)
但是doc
的解析没有找到。
想自己研究一下,目前找到的是doc
和xls
文件的二进制格式说明。
之所以连xls
也找来,是因为想结合extrame/xls
看一下解析的思路。
点后面的PDF
可以下载文档
在PDF
文档第22页,有比较关键的定位标记(具体叫什么我也不清楚,但是在extrame/xls
中是可以看到源码中有用到,比如0x0809
, 0x0042
等等)
目前研究到这里。
等我琢磨一下doc
,再来补充吧。。。
更新于2023-05-06
这个文档的2.7 Document Properties
定义了Word的各个版本的二进制结构
更新于2023-05-08
2.5 The File Infomation Block
定义了FIB的数据结构:
// 字段前面的`F`是我顺手加的,因为必须要大写开头。
// 定义Fib
type Fib struct {
Fbase FibBase
Fcsw uint16
FfibRgW FibRgW
Fcslw uint16
FfibRgLW FibRgLW
FcbRgFcLcb uint16
FfibRgFcLcbBlob FibRgFcLcbBlob
FcswNew uint16
FfibRgCswNew FibRgCswNew
}
// 定义FibBase
type FibBase struct {
FwIdent uint16
FnFib uint16
Funused1 uint16
Flid uint16
FpnNext uint16
FA_M1 uint8 // 补充说明:定义字段时A-M段,我写作FA_M,因为要两个uint8,所以这里有两个成员FA_M1, FA_M2
FA_M2 uint8
FnFibBack uint16
FlKey uint32
Fenvr uint8
FN_S uint8
Freserved3 uint16
Freserved4 uint16
Freserved5 uint32
Freserved6 uint32
}
// 定义其他结构体...
然后读取数据
fileName := "test.doc"
var fi *os.File
if fi, err = os.Open(fileName); err == nil {
var ole *ole2.Ole
if ole, err = ole2.Open(fi, "utf-8"); err == nil {
var dir []*ole2.File
if dir, err = ole.ListDir(); err == nil {
var word *ole2.File
var root *ole2.File
for _, file := range dir {
name := file.Name()
// 参考:https://interoperability.blob.core.windows.net/files/MS-DOC/%5bMS-DOC%5d.pdf
if name == "Root Entry" {
root = file
}
if name == "WordDocument" {
word = file
}
}
if word == nil || root == nil {
return
}
rs := ole.OpenFile(word, root)
doc := new(Doc)
doc.rs = rs
doc.parse()
}
}
}
// doc.parse方法...
buf := doc.rs
b := new(Fib)
if err := binary.Read(buf, binary.LittleEndian, b); err == nil {
DLog(b)
}
就把数据读取到结构体中了:
对照文档对FibBase部分的说明:
可以发现wIdent
和nFib
都对应上了
42476(10) = 0xA5EC(16)
193(10) = 0x00C1(16)
不过A-M段对应有问题,
J
属于MUST be的值,却对应不上,不知道我哪里出了问题。
曾经考虑是不是“二进制高低位”的问题,也就是binary.LittleEndian、binary.BigEndian的区别。
但是byte(uint8)应该不存在高低位了,只有uint16及以上会涉及到这个问题呀。。。
这也是为什么FibBase中定义A-M段的时候,用了两个uint8来接收数据
FA_M1 uint8 // 包含A-E
FA_M2 uint8 // 包含F-M
然后查看Fib其他字段的值,也有对应。
更新于2023-05-09
类似上面的数据解析还有很多,相比上次更新,又做了很多处理,
然而数据格式太过于复杂,我也不太能理解一些描述,逻辑不明确,放弃了。
简书不能上传文件,代码也没啥意义,就不放了。