From 5307042a75560b65786cc60050c4df2731c37e1b Mon Sep 17 00:00:00 2001 From: Oliver Gasser Date: Tue, 6 Feb 2018 15:54:47 +0100 Subject: [PATCH 1/3] Add basicList support --- interpreter.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/interpreter.go b/interpreter.go index e06e180..8e605ab 100644 --- a/interpreter.go +++ b/interpreter.go @@ -7,6 +7,7 @@ import ( "math" "net" "os" + "strings" "time" ) @@ -43,6 +44,7 @@ const ( DateTimeNanoseconds Ipv4Address Ipv6Address + BasicList ) // FieldTypes maps string representations of field types into their @@ -68,6 +70,7 @@ var FieldTypes = map[string]FieldType{ "dateTimeNanoseconds": DateTimeNanoseconds, "ipv4Address": Ipv4Address, "ipv6Address": Ipv6Address, + "basicList": BasicList, } // minLength is the minimum length of a field of the given type, in bytes. @@ -161,7 +164,24 @@ func (i *Interpreter) InterpretInto(rec DataRecord, fieldList []InterpretedField if entry, ok := i.dictionary[dictionaryKey{field.EnterpriseID, field.FieldID}]; ok { fieldList[j].Name = entry.Name - fieldList[j].Value = interpretBytes(&rec.Fields[j], entry.Type) + + if entry.Type == BasicList { + bs := &rec.Fields[j] + semantic := uint8(number((*bs)[0:1])) + fieldID := uint16(number((*bs)[1:3])) + fieldLen := uint16(number((*bs)[3:5])) + + listString := fmt.Sprintf("(semantic=%d,fieldID=%d,fieldLen=%d)[", semantic, fieldID, fieldLen) + + for offset := 5; offset < len(*bs); offset += int(fieldLen) { + temp := (*bs)[offset : offset+int(fieldLen)] + listString = fmt.Sprintf("%s%v,", listString, interpretBytes(&temp, i.dictionary[dictionaryKey{0, fieldID}].Type)) + } + + fieldList[j].Value = strings.TrimRight(listString, ",") + "]" + } else { + fieldList[j].Value = interpretBytes(&rec.Fields[j], entry.Type) + } } else { fieldList[j].RawValue = rec.Fields[j] } From 16edca662d5f11b0b95edf88616ddcf221c096f9 Mon Sep 17 00:00:00 2001 From: Oliver Gasser Date: Wed, 7 Feb 2018 10:48:54 +0100 Subject: [PATCH 2/3] Return basicList as []interface{} --- interpreter.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/interpreter.go b/interpreter.go index 8e605ab..32f686c 100644 --- a/interpreter.go +++ b/interpreter.go @@ -7,7 +7,6 @@ import ( "math" "net" "os" - "strings" "time" ) @@ -167,18 +166,17 @@ func (i *Interpreter) InterpretInto(rec DataRecord, fieldList []InterpretedField if entry.Type == BasicList { bs := &rec.Fields[j] - semantic := uint8(number((*bs)[0:1])) fieldID := uint16(number((*bs)[1:3])) fieldLen := uint16(number((*bs)[3:5])) - listString := fmt.Sprintf("(semantic=%d,fieldID=%d,fieldLen=%d)[", semantic, fieldID, fieldLen) + var list []interface{} for offset := 5; offset < len(*bs); offset += int(fieldLen) { temp := (*bs)[offset : offset+int(fieldLen)] - listString = fmt.Sprintf("%s%v,", listString, interpretBytes(&temp, i.dictionary[dictionaryKey{0, fieldID}].Type)) + list = append(list, interpretBytes(&temp, i.dictionary[dictionaryKey{0, fieldID}].Type)) } - fieldList[j].Value = strings.TrimRight(listString, ",") + "]" + fieldList[j].Value = list } else { fieldList[j].Value = interpretBytes(&rec.Fields[j], entry.Type) } From fe3dda654018c17fb23ec8dab28b06d027a8700d Mon Sep 17 00:00:00 2001 From: Oliver Gasser Date: Wed, 7 Feb 2018 11:10:05 +0100 Subject: [PATCH 3/3] basicList: add support for private enterprise numbers --- interpreter.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/interpreter.go b/interpreter.go index 32f686c..ed00785 100644 --- a/interpreter.go +++ b/interpreter.go @@ -5,6 +5,7 @@ import ( "encoding/binary" "fmt" "math" + "math/bits" "net" "os" "time" @@ -169,11 +170,19 @@ func (i *Interpreter) InterpretInto(rec DataRecord, fieldList []InterpretedField fieldID := uint16(number((*bs)[1:3])) fieldLen := uint16(number((*bs)[3:5])) + var pen uint32 = 0 + offset := 5 + // Test for PEN field type + if bits.LeadingZeros16(fieldID) == 0 { + pen = uint32(number((*bs)[5:9])) + offset += 4 + } + var list []interface{} - for offset := 5; offset < len(*bs); offset += int(fieldLen) { + for ; offset < len(*bs); offset += int(fieldLen) { temp := (*bs)[offset : offset+int(fieldLen)] - list = append(list, interpretBytes(&temp, i.dictionary[dictionaryKey{0, fieldID}].Type)) + list = append(list, interpretBytes(&temp, i.dictionary[dictionaryKey{pen, fieldID}].Type)) } fieldList[j].Value = list