From a77cf8169b42a4394e62f7a381ca546b27d0f723 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Mon, 7 Nov 2022 16:09:44 +0300 Subject: starting fresh for the third time --- .gitignore | 3 +- classes/classes.go | 199 ----------------------------------------------- classes/netsvc/netsvc.go | 32 -------- classes/netsvc/types.go | 106 ------------------------- classes/types.go | 60 -------------- go.mod | 2 +- go.sum | 4 + main.go | 8 +- messages/header.go | 29 ------- messages/messages.go | 78 ------------------- messages/types.go | 52 ------------- packets/header.go | 33 ++++++++ packets/message.go | 64 +++++++++++++++ packets/types.go | 64 +++++++++++++++ utils/utils.go | 62 --------------- 15 files changed, 173 insertions(+), 623 deletions(-) delete mode 100644 classes/classes.go delete mode 100644 classes/netsvc/netsvc.go delete mode 100644 classes/netsvc/types.go delete mode 100644 classes/types.go delete mode 100644 messages/header.go delete mode 100644 messages/messages.go delete mode 100644 messages/types.go create mode 100644 packets/header.go create mode 100644 packets/message.go create mode 100644 packets/types.go delete mode 100644 utils/utils.go diff --git a/.gitignore b/.gitignore index 55fc782..b08bea9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .vscode -*.dem \ No newline at end of file +*.dem +*.txt \ No newline at end of file diff --git a/classes/classes.go b/classes/classes.go deleted file mode 100644 index 4d6acb0..0000000 --- a/classes/classes.go +++ /dev/null @@ -1,199 +0,0 @@ -package classes - -import ( - "encoding/binary" - "os" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/utils" -) - -func ParseCmdInfo(file *os.File, MSSC int) []CmdInfo { - array := utils.ReadByteFromFile(file, 76*int32(MSSC)) - var cmdinfoarray []CmdInfo - for count := 0; count < MSSC; count++ { - var cmdinfo CmdInfo - cmdinfo.Flags = int32(binary.LittleEndian.Uint32(array[0+76*count : 4+76*count])) - cmdinfo.ViewOrigin = utils.FloatArrFromBytes(array[4+76*count : 16+76*count]) - cmdinfo.ViewAngles = utils.FloatArrFromBytes(array[16+76*count : 28+76*count]) - cmdinfo.LocalViewAngles = utils.FloatArrFromBytes(array[28+76*count : 40+76*count]) - cmdinfo.ViewOrigin2 = utils.FloatArrFromBytes(array[40+76*count : 52+76*count]) - cmdinfo.ViewAngles2 = utils.FloatArrFromBytes(array[52+76*count : 64+76*count]) - cmdinfo.LocalViewAngles2 = utils.FloatArrFromBytes(array[64+76*count : 76+76*count]) - cmdinfoarray = append(cmdinfoarray, cmdinfo) - } - return cmdinfoarray -} - -func ParseUserCmdInfo(file *os.File, size int) UserCmdInfo { - reader := bitreader.Reader(file, true) - var usercmd UserCmdInfo - count := 0 - flag, err := reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.CommandNumber = int32(reader.TryReadInt32()) - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.TickCount = int32(reader.TryReadInt32()) - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.ViewAnglesX = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.ViewAnglesY = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.ViewAnglesZ = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.ForwardMove = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.SideMove = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.UpMove = reader.TryReadFloat32() - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.Buttons = int32(reader.TryReadInt32()) - count += 32 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - //reader.SkipBits(8) - usercmd.Impulse = int8(reader.TryReadInt8()) - count += 8 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - value, err := reader.ReadBits(11) - utils.CheckError(err) - usercmd.WeaponSelect = int(value) - flag, err = reader.ReadBool() - utils.CheckError(err) - count += 11 - if flag { - value, err := reader.ReadBits(6) - utils.CheckError(err) - usercmd.WeaponSubtype = int(value) - count += 6 - } - count++ - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.MouseDx = int16(reader.TryReadInt16()) - count += 16 - } - count++ - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - usercmd.MouseDy = int16(reader.TryReadInt16()) - count += 16 - } - count++ - reader.SkipBits(size*8 - count) // Skip remaining bits from specified size - return usercmd -} - -/*func ParseStringTable(file *os.File, size int) []StringTable { - reader := bitreader.Reader(file, true) - var stringtable StringTable - var stringtablearray []StringTable - //count := 0 - stringtable.NumOfTables = int8(reader.TryReadInt8()) - for i := 0; i < int(stringtable.NumOfTables); i++ { - stringtable.TableName = utils.ReadStringFromFile(file) - stringtable.NumOfEntries = int16(reader.TryReadInt16()) - stringtable.EntryName = utils.ReadStringFromFile(file) - flag, err := reader.ReadBool() - utils.CheckError(err) - if flag { - stringtable.EntrySize = int16(reader.TryReadInt16()) - } - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - fmt.Println(int(stringtable.EntrySize)) - reader.SkipBytes(int(stringtable.EntrySize)) - var bytearray []byte - for i := 0; i < int(stringtable.EntrySize); i++ { - value, err := reader.ReadBytes(1) - utils.CheckError(err) - bytearray = append(bytearray, byte(value)) - } - stringtable.EntryData = bytearrray - } - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - stringtable.NumOfClientEntries = int16(reader.TryReadInt16()) - } - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - stringtable.ClientEntryName = utils.ReadStringFromFile(file) - } - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - stringtable.ClientEntrySize = int16(reader.TryReadInt16()) - } - flag, err = reader.ReadBool() - utils.CheckError(err) - if flag { - reader.SkipBytes(int(stringtable.ClientEntrySize)) - /*var bytearray []byte - for i := 0; i < int(stringtable.ClientEntrySize); i++ { - value, err := reader.ReadBytes(1) - utils.CheckError(err) - bytearray = append(bytearray, byte(value)) - } - stringtable.ClientEntryData = bytearrray - } - stringtablearray = append(stringtablearray, stringtable) - } - - //reader.SkipBits(size*8 - 8) - return stringtablearray -}*/ diff --git a/classes/netsvc/netsvc.go b/classes/netsvc/netsvc.go deleted file mode 100644 index a454310..0000000 --- a/classes/netsvc/netsvc.go +++ /dev/null @@ -1,32 +0,0 @@ -package netsvc - -import ( - "bytes" - "fmt" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/utils" -) - -const NET_TICK_SCALEUP = 10000 - -func ParseNetSvcMessage(file []byte) { - reader := bitreader.Reader(bytes.NewReader(file), true) - bitsRead := 0 - for { - messageType, err := reader.ReadBits(6) - if err != nil { // No remaining bits left - break - } - switch messageType { - case 16: - var svcprint SvcPrint - svcprint.Message = utils.ReadStringFromSlice(file) - fmt.Println(svcprint) - bitsRead += len(svcprint.Message) * 8 - default: - //fmt.Println("default") - break - } - } -} diff --git a/classes/netsvc/types.go b/classes/netsvc/types.go deleted file mode 100644 index 2a52f96..0000000 --- a/classes/netsvc/types.go +++ /dev/null @@ -1,106 +0,0 @@ -package netsvc - -type NetDisconnect struct { - Text string -} - -type NetFile struct { - TransferId int32 - FileName string - FileRequested bool -} - -type NetSplitScreenUser struct { - Unknown bool -} - -type NetTick struct { - Tick int32 - HostFrameTime int16 - HostFrameTimeStdDeviation int16 -} - -type NetStringCmd struct { - Command string -} - -type ConVar struct { - Name string - Value string -} - -type NetSetConVar struct { - Length int8 - ConVars []ConVar -} - -type NetSignonStateOE struct { - SignonState int8 - SpawnCount int32 -} - -type NetSignonStateNE struct { - NetSignonStateOE - NumServerPlayers int32 - IdsLength int32 - PlayerNetworkIds []byte - MapNameLength int32 - MapName string -} - -type SvcServerInfo struct { - Protocol int8 - ServerCount int32 - IsHltv bool - IsDedicated bool - ClientCrc int32 - MaxClasses int16 - MapCrc int32 - PlayerSlot int8 - MaxClients int8 - Unk int32 // NE - TickInterval float32 - COs byte - GameDir string - MapName string - SkyName string - HostName string -} - -type SvcSendTable struct { - NeedsDecoder bool - Length int8 - Props int // ? -} - -type ServerClass struct { - ClassId int8 - ClassName string - DataTableName string -} - -type SvcClassInfo struct { - Length int16 - CreateOnClient bool - ServerClasses []ServerClass -} - -type SvcSetPause struct { - Paused bool -} - -type SvcCreateStringTable struct { - Name string - MaxEntries int16 - NumEntries int8 - Length int32 - UserDataFixedSize bool - UserDataSize int32 - UserDataSizeBits int8 - Flags int8 - StringData int // ? -} - -type SvcPrint struct { - Message string -} diff --git a/classes/types.go b/classes/types.go deleted file mode 100644 index 20c793a..0000000 --- a/classes/types.go +++ /dev/null @@ -1,60 +0,0 @@ -package classes - -type CmdInfo struct { - Flags int32 - ViewOrigin []float32 - ViewAngles []float32 - LocalViewAngles []float32 - ViewOrigin2 []float32 - ViewAngles2 []float32 - LocalViewAngles2 []float32 -} - -type UserCmdInfo struct { - CommandNumber int32 - TickCount int32 - ViewAnglesX float32 - ViewAnglesY float32 - ViewAnglesZ float32 - ForwardMove float32 - SideMove float32 - UpMove float32 - Buttons int32 - Impulse int8 - WeaponSelect int - WeaponSubtype int - MouseDx int16 - MouseDy int16 -} - -type DataTables struct { - SendTable []SendTable - ServerClassInfo []ServerClassInfo -} - -type SendTable struct { - NetTableName string - NumOfProps int - SendPropType int - SendPropName string - SendPropFlags int -} - -type ServerClassInfo struct { -} - -type StringTable struct { - NumOfTables int8 - TableName string - NumOfEntries int16 - EntryName string - EntrySize int16 - EntryData []byte - NumOfClientEntries int16 - ClientEntryName string - ClientEntrySize int16 - ClientEntryData []byte -} - -type GameEvent struct { -} diff --git a/go.mod b/go.mod index 9bc243f..8b852ea 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/pektezol/demoparser go 1.19 -require github.com/pektezol/bitreader v1.1.2 +require github.com/pektezol/bitreader v1.2.1 diff --git a/go.sum b/go.sum index 6cac544..34c0ab2 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,6 @@ github.com/pektezol/bitreader v1.1.2 h1:F0u8qiauIwh52lwiwy7UMQ03/bw4NuEXQU0UFBL+A2w= github.com/pektezol/bitreader v1.1.2/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= +github.com/pektezol/bitreader v1.2.0 h1:7sr46Rgx06j5+adLn3xOUSHc+Pz2GoFC1BIk+2ktdxg= +github.com/pektezol/bitreader v1.2.0/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= +github.com/pektezol/bitreader v1.2.1 h1:ChmgZjsi1hftUgH2LkfttjsER5UGYxrwwfsH2QCx/SU= +github.com/pektezol/bitreader v1.2.1/go.mod h1:RKAUiA//jCPJzO10P+VSkBq4wfY38TaNjpCjQ+DmbcQ= diff --git a/main.go b/main.go index 4aa7fd1..9f33161 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,8 @@ import ( "log" "os" - "github.com/pektezol/demoparser/messages" + "github.com/pektezol/bitreader" + "github.com/pektezol/demoparser/packets" ) func main() { @@ -19,9 +20,10 @@ func main() { if err != nil { panic(err) } - messages.ParseHeader(file) + reader := bitreader.Reader(file, true) + packets.ParseHeader(reader) for { - code := messages.ParseMessage(file) + code := packets.ParseMessage(reader) if code == 7 { break } diff --git a/messages/header.go b/messages/header.go deleted file mode 100644 index 34b36d3..0000000 --- a/messages/header.go +++ /dev/null @@ -1,29 +0,0 @@ -package messages - -import ( - "fmt" - "os" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/utils" -) - -func ParseHeader(file *os.File) { - var header Header - reader := bitreader.Reader(file, true) - header.DemoFileStamp = string(utils.ReadByteFromFile(file, 8)) - header.DemoProtocol = int32(reader.TryReadInt32()) - header.NetworkProtocol = int32(reader.TryReadInt32()) - header.ServerName = string(utils.ReadByteFromFile(file, 260)) - header.ClientName = string(utils.ReadByteFromFile(file, 260)) - header.MapName = string(utils.ReadByteFromFile(file, 260)) - header.GameDirectory = string(utils.ReadByteFromFile(file, 260)) - header.PlaybackTime = float32(reader.TryReadFloat32()) - header.PlaybackTicks = int32(reader.TryReadInt32()) - header.PlaybackFrames = int32(reader.TryReadInt32()) - header.SignOnLength = int32(reader.TryReadInt32()) - if header.DemoProtocol != 4 { // Old Engine == 2, 3 / New Engine == 4 - panic("Only New Engine is supported.") - } - fmt.Printf("%+v", header) -} diff --git a/messages/messages.go b/messages/messages.go deleted file mode 100644 index b40684b..0000000 --- a/messages/messages.go +++ /dev/null @@ -1,78 +0,0 @@ -package messages - -import ( - "fmt" - "os" - - "github.com/pektezol/bitreader" - "github.com/pektezol/demoparser/classes" - "github.com/pektezol/demoparser/classes/netsvc" - "github.com/pektezol/demoparser/utils" -) - -func ParseMessage(file *os.File) (statusCode int) { - reader := bitreader.Reader(file, true) - messageType := reader.TryReadInt8() - messageTick := reader.TryReadInt32() - messageSlot := reader.TryReadInt8() - //fmt.Println(messageType, messageTick, messageSlot) - switch messageType { - case 0x01: // SignOn - var packet Packet - packet.PacketInfo = classes.ParseCmdInfo(file, 2) - packet.InSequence = int32(reader.TryReadInt32()) - packet.OutSequence = int32(reader.TryReadInt32()) - packet.Size = int32(reader.TryReadInt32()) - data := utils.ReadByteFromFile(file, packet.Size) - //fmt.Println(data) - netsvc.ParseNetSvcMessage(data) - //reader.SkipBytes(int(packet.Size)) // TODO: NET/SVC Message Parsing - fmt.Printf("[%d] (%d) SignOn: %v\n", messageTick, messageSlot, packet) - return 1 - case 0x02: // Packet - var packet Packet - packet.PacketInfo = classes.ParseCmdInfo(file, 2) - packet.InSequence = int32(reader.TryReadInt32()) - packet.OutSequence = int32(reader.TryReadInt32()) - packet.Size = int32(reader.TryReadInt32()) - reader.SkipBytes(int(packet.Size)) // TODO: NET/SVC Message Parsing - //fmt.Printf("[%d] Packet: %v\n", messageTick, packet) - return 2 - case 0x03: // SyncTick - return 3 - case 0x04: // ConsoleCmd - var consolecmd ConsoleCmd - consolecmd.Size = int32(reader.TryReadInt32()) - consolecmd.Data = string(utils.ReadByteFromFile(file, consolecmd.Size)) - //fmt.Printf("[%d] ConsoleCmd: %s\n", messageTick, consolecmd.Data) - return 4 - case 0x05: // UserCmd - var usercmd UserCmd - usercmd.Cmd = int32(reader.TryReadInt32()) - usercmd.Size = int32(reader.TryReadInt32()) - usercmd.Data = classes.ParseUserCmdInfo(file, int(usercmd.Size)) - //fmt.Printf("[%d] UserCmd: %v\n", messageTick, usercmd.Data) - return 5 - case 0x06: // DataTables - var datatables DataTables - datatables.Size = int32(reader.TryReadInt32()) - reader.SkipBytes(int(datatables.Size)) // TODO: DataTables Data - return 6 - case 0x07: // Stop - fmt.Printf("[%d] Stop\n", messageTick) - return 7 - case 0x08: // CustomData - var customdata CustomData - customdata.Unknown = int32(reader.TryReadInt32()) - customdata.Size = int32(reader.TryReadInt32()) - reader.SkipBytes(int(customdata.Size)) // TODO: CustomData Data - return 8 - case 0x09: // StringTables - var stringtables StringTables - stringtables.Size = int32(reader.TryReadInt32()) - reader.SkipBytes(int(stringtables.Size)) // TODO: StringTables Data - return 9 - default: - return 0 - } -} diff --git a/messages/types.go b/messages/types.go deleted file mode 100644 index 9c92c54..0000000 --- a/messages/types.go +++ /dev/null @@ -1,52 +0,0 @@ -package messages - -import "github.com/pektezol/demoparser/classes" - -type Header struct { - DemoFileStamp string - DemoProtocol int32 - NetworkProtocol int32 - ServerName string - ClientName string - MapName string - GameDirectory string - PlaybackTime float32 - PlaybackTicks int32 - PlaybackFrames int32 - SignOnLength int32 -} - -type Packet struct { - PacketInfo []classes.CmdInfo - InSequence int32 - OutSequence int32 - Size int32 - Data []byte -} - -type ConsoleCmd struct { - Size int32 - Data string -} - -type UserCmd struct { - Cmd int32 - Size int32 - Data classes.UserCmdInfo -} - -type DataTables struct { - Size int32 - Data classes.DataTables -} - -type CustomData struct { - Unknown int32 - Size int32 - Data []byte -} - -type StringTables struct { - Size int32 - Data []classes.StringTable -} diff --git a/packets/header.go b/packets/header.go new file mode 100644 index 0000000..60cd146 --- /dev/null +++ b/packets/header.go @@ -0,0 +1,33 @@ +package packets + +import ( + "fmt" + + "github.com/pektezol/bitreader" +) + +func ParseHeader(reader *bitreader.ReaderType) { + header := Header{ + DemoFileStamp: reader.TryReadStringLen(8), + DemoProtocol: uint(reader.TryReadInt32()), + NetworkProtocol: uint(reader.TryReadInt32()), + ServerName: reader.TryReadStringLen(260), + ClientName: reader.TryReadStringLen(260), + MapName: reader.TryReadStringLen(260), + GameDirectory: reader.TryReadStringLen(260), + PlaybackTime: reader.TryReadFloat32(), + PlaybackTicks: int(reader.TryReadInt32()), + PlaybackFrames: int(reader.TryReadInt32()), + SignOnLength: uint(reader.TryReadInt32()), + } + if header.DemoFileStamp != "HL2DEMO" { + panic("Invalid demo file stamp. Make sure a valid demo file is given.") + } + if header.DemoProtocol != 4 { + panic("Given demo is from old engine. This parser is only supported for new engine.") + } + if header.NetworkProtocol != 2001 { + panic("Given demo is not from Portal2. This parser currently only supports Portal 2.") + } + fmt.Println(header) +} diff --git a/packets/message.go b/packets/message.go new file mode 100644 index 0000000..a8e830d --- /dev/null +++ b/packets/message.go @@ -0,0 +1,64 @@ +package packets + +import ( + "fmt" + + "github.com/pektezol/bitreader" +) + +func ParseMessage(reader *bitreader.ReaderType) (status int) { + messageType := reader.TryReadInt8() + messageTick := reader.TryReadInt32() + messageSlot := reader.TryReadInt8() + //fmt.Println(messageType, messageTick, messageSlot) + switch messageType { + case 0x01: + //signOn := SignOn{} + reader.SkipBytes(76*2 + 8) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + fmt.Printf("[%d] (%d) {%d} SignOn: \n", messageTick, messageType, messageSlot) + return 1 + case 0x02: + reader.SkipBytes(76*2 + 8) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) Packet: \n", messageTick, messageType) + return 2 + case 0x03: + fmt.Printf("[%d] (%d) SyncTick: \n", messageTick, messageType) + return 3 + case 0x04: + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) ConsoleCmd: \n", messageTick, messageType) + return 4 + case 0x05: + reader.SkipBytes(4) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) UserCmd: \n", messageTick, messageType) + return 5 + case 0x06: + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) DataTables: \n", messageTick, messageType) + return 6 + case 0x07: + fmt.Printf("[%d] (%d) Stop: \n", messageTick, messageType) + return 7 + case 0x08: + reader.SkipBytes(4) + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) CustomData: \n", messageTick, messageType) + return 8 + case 0x09: + val := reader.TryReadInt32() + reader.SkipBytes(int(val)) + // fmt.Printf("[%d] (%d) StringTables: \n", messageTick, messageType) + return 9 + default: + return 0 + } +} diff --git a/packets/types.go b/packets/types.go new file mode 100644 index 0000000..5f7a29b --- /dev/null +++ b/packets/types.go @@ -0,0 +1,64 @@ +package packets + +type Header struct { + DemoFileStamp string + DemoProtocol uint + NetworkProtocol uint + ServerName string + ClientName string + MapName string + GameDirectory string + PlaybackTime float32 + PlaybackTicks int + PlaybackFrames int + SignOnLength uint +} + +type SignOn struct { + PacketInfo []byte + InSequence int32 + OutSequence int32 + Size int32 + Data []byte +} + +type Packet struct { + PacketInfo []byte + InSequence int32 + OutSequence int32 + Size int32 + Data []byte +} + +type SyncTick struct{} + +type ConsoleCmd struct { + Size int32 + Data string +} + +type UserCmd struct { + Cmd int32 + Size int32 + Data []byte +} + +type DataTables struct { + Size int32 + Data []byte +} + +type Stop struct { + RemainingData []byte +} + +type CustomData struct { + Unknown int32 + Size int32 + Data []byte +} + +type StringTables struct { + Size int32 + Data []byte +} diff --git a/utils/utils.go b/utils/utils.go deleted file mode 100644 index db1b02f..0000000 --- a/utils/utils.go +++ /dev/null @@ -1,62 +0,0 @@ -package utils - -import ( - "bytes" - "os" - "unsafe" - - "github.com/pektezol/bitreader" -) - -func CheckError(e error) { - if e != nil { - panic(e) - } -} - -func ReadByteFromFile(file *os.File, size int32) []byte { - tmp := make([]byte, size) - file.Read(tmp) - return tmp -} - -func ReadStringFromFile(file *os.File) string { - var output string - reader := bitreader.Reader(file, true) - for { - value, err := reader.ReadBytes(1) - CheckError(err) - if value == 0 { - break - } - output += string(rune(value)) - } - return output -} - -func ReadStringFromSlice(file []byte) string { - var output string - reader := bitreader.Reader(bytes.NewReader(file), true) - for { - value, err := reader.ReadBytes(1) - CheckError(err) - if value == 0 { - break - } - output += string(rune(value)) - } - return output -} - -func FloatArrFromBytes(byteArr []byte) []float32 { - if len(byteArr) == 0 { - return nil - } - l := len(byteArr) / 4 - ptr := unsafe.Pointer(&byteArr[0]) - // It is important to keep in mind that the Go garbage collector - // will not interact with this data, and that if src if freed, - // the behavior of any Go code using the slice is nondeterministic. - // Reference: https://github.com/golang/go/wiki/cgo#turning-c-arrays-into-go-slices - return (*[1 << 26]float32)((*[1 << 26]float32)(ptr))[:l:l] -} -- cgit v1.2.3