Skip to content

Commit 6215403

Browse files
committed
added condition support
1 parent 5368024 commit 6215403

File tree

2 files changed

+51
-26
lines changed

2 files changed

+51
-26
lines changed

hdec.py

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44
import struct
55

66
class Field:
7-
def __init__(self, name, bits, types, prefix = ""):
7+
def __init__(self, name, bits, types, prefix = "", condition = "True"):
88
self.name = name
99
self.bits = bits
1010
self.types = types
1111
self.prefix = prefix
12+
self.condition = condition
1213

1314
def __repr__(self):
1415
return self.name + " (" + str(self.bits) + ")"
@@ -30,18 +31,28 @@ def getTypes(self):
3031

3132
def getPrefix(self):
3233
return self.prefix
34+
35+
def getCondition(self):
36+
return self.condition
3337

3438

3539
def parseDefinition(definition, bits = []):
3640
with open(definition) as df:
3741
d = df.readlines()
3842
for l in d:
3943
p = l.split(":")
40-
if len(p) == 2:
41-
bits.append(Field(p[0].strip(), (p[1].strip()), ["hex", "int", "bin"], definition))
42-
elif len(p) == 3:
43-
types = list(map(lambda x: x.strip(), p[2].strip().split(",")))
44-
bits.append(Field(p[0].strip(), (p[1].strip()), types, definition))
44+
name = p[0].strip()
45+
bitlen = p[1].strip()
46+
ptypes = ["hex", "int", "bin"]
47+
cond = "True"
48+
49+
if len(p) == 3:
50+
ptypes = list(map(lambda x: x.strip(), p[2].strip().split(",")))
51+
if len(p) == 4:
52+
cond = p[3].strip()
53+
54+
bits.append(Field(name, bitlen, ptypes, definition, cond))
55+
4556
return bits
4657

4758
def endianness(x, endian, bits):
@@ -96,34 +107,42 @@ def main(argv):
96107

97108
bitlen = 0
98109
lenexpr = bit.getBits()
110+
condexpr = bit.getCondition()
99111
for p in parsed.keys():
100112
lenexpr = lenexpr.replace(p, str(parsed[p]))
113+
condexpr = condexpr.replace(p, str(parsed[p]))
101114
try:
102115
bitlen = eval(lenexpr)
103116
except:
104117
print("Error: " + str(bit.getBits()) + " is not a valid size!")
105118
return
119+
try:
120+
cond = eval(condexpr)
121+
except:
122+
print("Error: " + str(bit.Condition()) + " is not a valid condition!")
123+
return
106124

107-
val = field.read(bitlen)
108-
parsed[bit.getName()] = val.uint
109-
pos += bitlen
110-
if last_header is not bit.getPrefix():
111-
last_header = bit.getPrefix()
112-
print("")
113-
114-
out = bit.getName() + ": "
115-
for t, endian in bit.getTypes():
116-
if t == "hex":
117-
out += "0x" + val.hex + " "
118-
if t == "int":
119-
out += str(endianness(val.uint, endian, int(bitlen))) + " "
120-
if t == "bin":
121-
out += "0b" + val.bin + " "
122-
if t == "str":
123-
s = ""
124-
for si in range(0, len(str(val)[2:]), 2):
125-
out += str(chr(int(str(val)[si + 2:si + 4], 16)))
126-
print(out)
125+
if cond:
126+
val = field.read(bitlen)
127+
parsed[bit.getName()] = val.uint
128+
pos += bitlen
129+
if last_header is not bit.getPrefix():
130+
last_header = bit.getPrefix()
131+
print("")
132+
133+
out = bit.getName() + ": "
134+
for t, endian in bit.getTypes():
135+
if t == "hex":
136+
out += "0x" + val.hex + " "
137+
if t == "int":
138+
out += str(endianness(val.uint, endian, int(bitlen))) + " "
139+
if t == "bin":
140+
out += "0b" + val.bin + " "
141+
if t == "str":
142+
s = ""
143+
for si in range(0, len(str(val)[2:]), 2):
144+
out += str(chr(int(str(val)[si + 2:si + 4], 16)))
145+
print(out)
127146

128147
if __name__ == "__main__":
129148
main(sys.argv)

header/UDP_IPHC

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Start: 5: bin
2+
HasChecksum: 1: bin
3+
Ports: 2: bin
4+
PortOffset1: 4: bin, int: Ports == 3
5+
PortOffset2: 4: bin, int: Ports == 3
6+
Checksum: 16: hex: HasChecksum == 1

0 commit comments

Comments
 (0)