Go binary.read返回“;意外EOF“;无论我使用什么数据库(.dbf)文件
以上是相关代码。无论我使用什么样的dbf文件,程序都会崩溃。我不知道为什么我总是遇到“意外的EOF”错误。在过去的几天里,我一直在努力解决这个问题,但不幸的是,没有运气。您没有提供任何证据证明您的文件格式是正确的。在编写程序之前,您应该确认文件的格式正确 文件的前256个字节是多少?比如说,Go binary.read返回“;意外EOF“;无论我使用什么数据库(.dbf)文件,go,dbase,Go,Dbase,以上是相关代码。无论我使用什么样的dbf文件,程序都会崩溃。我不知道为什么我总是遇到“意外的EOF”错误。在过去的几天里,我一直在努力解决这个问题,但不幸的是,没有运气。您没有提供任何证据证明您的文件格式是正确的。在编写程序之前,您应该确认文件的格式正确 文件的前256个字节是多少?比如说, hex.go: func main() { file, err := os.Open("example.dbf") // For read access. if err !=
hex.go
:
func main() {
file, err := os.Open("example.dbf") // For read access.
if err != nil {
log.Fatal(err)
}
dBaseioReader, err := NewReader(file)
if err != nil {
log.Fatal(err)
}
return nil
}
type dbHeader struct {
Version byte
LastUpdate [3]byte
NumRecords int32
NumBytesInHeader int16
NumBytesInRecord int16
_ [2]byte //reserved
IncompatFlag byte
EncryptionFlag byte
MultiUserProcessing [12]byte
MDXProductionFlag byte
LangDriverId byte
_ [2]byte //reserved
LangDriverName [32]byte
_ [4]byte //reserved
}
type dbFieldDescriptor struct {
FieldName [32]byte
FieldType byte
FieldLen byte
FieldDec byte
_ [2]byte
MDXProductionFlag byte
_ [2]byte
NextAutoIncrement [4]byte
_ [4]byte
}
type DBaseReader struct {
rawInput *bufio.Reader
Header *dbHeader
Fields []*dbFieldDescriptor
recordsLeft int
}
func NewReader(input io.Reader) (dbr *DBaseReader, err error) {
dbr = &DBaseReader{
rawInput: bufio.NewReaderSize(input, 32*1024),
Header: &dbHeader{},
}
err = binary.Read(dbr.rawInput, binary.LittleEndian, dbr.Header)
if err != nil{
return
}
dbr.recordsLeft = int(dbr.Header.NumRecords)
headerBytesLeft := dbr.Header.NumBytesInHeader
headerBytesLeft -= dbHeaderSize
// read field descriptors until 0x0D termination byte
var term []byte
for {
field := &dbFieldDescriptor{}
err = binary.Read(dbr.rawInput, binary.LittleEndian, field)
if err != nil{
//FIRST CRASH HAPPENS HERE.
return
}
dbr.Fields = append(dbr.Fields, field)
headerBytesLeft -= dbFieldDescriptorSize
// check for terminator byte
term, err = dbr.rawInput.Peek(1)
if err != nil{
return
}
if term[0] == 0x0D {
break
}
}
// read the terminator
_, err = dbr.rawInput.ReadByte()
if err != nil {
return
}
headerBytesLeft -= 1
if headerBytesLeft > 0 {
err = fmt.Errorf("Error: Header Bytes Left: %d.. Read Properties?!..\n", headerBytesLeft)
return
// headerLeftOver := make([]byte, headerBytesLeft)
// err = binary.Read(dbr.rawInput, binary.LittleEndian, headerLeftOver)
// if err != nil {
// return
// }
// props := &dbFieldProperties{}
// err = binary.Read(dbr.rawInput, binary.LittleEndian, props)
// if err != nil {
// return
// }
// fmt.Printf("Props: %#v\n", props)
}
// read until first record marker
_, err = dbr.rawInput.ReadBytes(' ')
if err != nil {
return
}
return dbr, nil
}
主程序包
进口(
“编码/十六进制”
“fmt”
“io/ioutil”
“操作系统”
“strconv”
)
func main(){
如果len(os.Args)2{
i、 错误:=strconv.Atoi(os.Args[2])
如果错误!=零{
fmt.Fprintln(os.Stderr,“字节:”,err)
返回
}
如果n>i{
n=i
}
}
格式打印(十六进制转储(数据[:n]))
}
输出:
package main
import (
"encoding/hex"
"fmt"
"io/ioutil"
"os"
"strconv"
)
func main() {
if len(os.Args) <= 1 {
fmt.Fprintln(os.Stderr, "usage: hex filename [bytes]")
return
}
data, err := ioutil.ReadFile(os.Args[1])
if err != nil {
fmt.Fprintln(os.Stderr, "filename:", err)
return
}
n := len(data)
if len(os.Args) > 2 {
i, err := strconv.Atoi(os.Args[2])
if err != nil {
fmt.Fprintln(os.Stderr, "bytes:", err)
return
}
if n > i {
n = i
}
}
fmt.Print(hex.Dump(data[:n]))
}
$go run hex.go example.dbf 256
00000000 03 01 04 18 01 00 00 41 07 d0 05 00 00 |……A|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 |................|
000000 20 54 52 41 43 4b 5f 49 44 00 00 43 01 00 00 |轨道ID…C|
000000 30 0b 00 00 00 ||
000000 40 4c 4d 55 4c 54 00 00 00 4c 0c 00 00 00 |结果……L|
00000050 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 4e 54 41 58 59 45 41 52 00 00 4e 0d 00 00 00 | NTAXYEAR…N|
00000070 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000 80 4e 43 4f 55 4e 54 59 43 4f 44 00 4e 11 00 00 00 | NCOUNTYCOD.N|
00000090 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000 A0 43 50 52 4f 50 41 44 00 00 43 13 00 00 | CPROPADD…C|
000000 B0 3c 00 00 00 00 00 |当堆栈崩溃时,您是否获得堆栈跟踪?它正在执行哪行代码?定义崩溃…感谢您的帮助!
$ go run hex.go example.dbf 256
00000000 03 01 04 18 01 00 00 00 41 07 d0 05 00 00 00 00 |........A.......|
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 |................|
00000020 54 52 41 43 4b 5f 49 44 00 00 00 43 01 00 00 00 |TRACK_ID...C....|
00000030 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 4c 4d 55 4c 54 00 00 00 00 00 00 4c 0c 00 00 00 |LMULT......L....|
00000050 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 4e 54 41 58 59 45 41 52 00 00 00 4e 0d 00 00 00 |NTAXYEAR...N....|
00000070 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000080 4e 43 4f 55 4e 54 59 43 4f 44 00 4e 11 00 00 00 |NCOUNTYCOD.N....|
00000090 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000a0 43 50 52 4f 50 41 44 44 00 00 00 43 13 00 00 00 |CPROPADD...C....|
000000b0 3c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |<...............|
000000c0 4c 43 4f 4d 4d 49 4e 44 00 00 00 4c 4f 00 00 00 |LCOMMIND...LO...|
000000d0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000000e0 4c 56 41 43 4c 41 4e 44 00 00 00 4c 50 00 00 00 |LVACLAND...LP...|
000000f0 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
$