@@ -29,10 +29,34 @@ defmodule MMDB2Decoder.Data do
29
29
Decodes the datatype found at the given offset of the data.
30
30
"""
31
31
@ spec decode ( binary , binary ) :: { decoded , binary }
32
+ def decode ( << @ binary :: size ( 3 ) , 29 :: size ( 5 ) , len :: size ( 8 ) , part_rest :: binary >> , _ ) do
33
+ decode_binary ( part_rest , 29 + len )
34
+ end
35
+
36
+ def decode ( << @ binary :: size ( 3 ) , 30 :: size ( 5 ) , len :: size ( 16 ) , part_rest :: binary >> , _ ) do
37
+ decode_binary ( part_rest , 285 + len )
38
+ end
39
+
40
+ def decode ( << @ binary :: size ( 3 ) , 31 :: size ( 5 ) , len :: size ( 24 ) , part_rest :: binary >> , _ ) do
41
+ decode_binary ( part_rest , 65821 + len )
42
+ end
43
+
32
44
def decode ( << @ binary :: size ( 3 ) , len :: size ( 5 ) , part_rest :: binary >> , _ ) do
33
45
decode_binary ( part_rest , len )
34
46
end
35
47
48
+ def decode ( << @ bytes :: size ( 3 ) , 29 :: size ( 5 ) , len :: size ( 8 ) , part_rest :: binary >> , _ ) do
49
+ decode_binary ( part_rest , 29 + len )
50
+ end
51
+
52
+ def decode ( << @ bytes :: size ( 3 ) , 30 :: size ( 5 ) , len :: size ( 16 ) , part_rest :: binary >> , _ ) do
53
+ decode_binary ( part_rest , 285 + len )
54
+ end
55
+
56
+ def decode ( << @ bytes :: size ( 3 ) , 31 :: size ( 5 ) , len :: size ( 24 ) , part_rest :: binary >> , _ ) do
57
+ decode_binary ( part_rest , 65821 + len )
58
+ end
59
+
36
60
def decode ( << @ bytes :: size ( 3 ) , len :: size ( 5 ) , part_rest :: binary >> , _ ) do
37
61
decode_binary ( part_rest , len )
38
62
end
@@ -41,6 +65,27 @@ defmodule MMDB2Decoder.Data do
41
65
{ Float . round ( value , 8 ) , part_rest }
42
66
end
43
67
68
+ def decode (
69
+ << @ extended :: size ( 3 ) , 29 :: size ( 5 ) , len :: size ( 8 ) , @ extended_array , part_rest :: binary >> ,
70
+ data_full
71
+ ) do
72
+ decode_array ( part_rest , data_full , 28 + len )
73
+ end
74
+
75
+ def decode (
76
+ << @ extended :: size ( 3 ) , 30 :: size ( 5 ) , len :: size ( 16 ) , @ extended_array , part_rest :: binary >> ,
77
+ data_full
78
+ ) do
79
+ decode_array ( part_rest , data_full , 285 + len )
80
+ end
81
+
82
+ def decode (
83
+ << @ extended :: size ( 3 ) , 31 :: size ( 5 ) , len :: size ( 24 ) , @ extended_array , part_rest :: binary >> ,
84
+ data_full
85
+ ) do
86
+ decode_array ( part_rest , data_full , 65821 + len )
87
+ end
88
+
44
89
def decode ( << @ extended :: size ( 3 ) , len :: size ( 5 ) , @ extended_array , part_rest :: binary >> , data_full ) do
45
90
decode_array ( part_rest , data_full , len )
46
91
end
@@ -82,6 +127,18 @@ defmodule MMDB2Decoder.Data do
82
127
decode_unsigned ( part_rest , len * 8 )
83
128
end
84
129
130
+ def decode ( << @ map :: size ( 3 ) , 29 :: size ( 5 ) , len :: size ( 8 ) , part_rest :: binary >> , data_full ) do
131
+ decode_map ( part_rest , data_full , 28 + len )
132
+ end
133
+
134
+ def decode ( << @ map :: size ( 3 ) , 30 :: size ( 5 ) , len :: size ( 16 ) , part_rest :: binary >> , data_full ) do
135
+ decode_map ( part_rest , data_full , 285 + len )
136
+ end
137
+
138
+ def decode ( << @ map :: size ( 3 ) , 31 :: size ( 5 ) , len :: size ( 24 ) , part_rest :: binary >> , data_full ) do
139
+ decode_map ( part_rest , data_full , 65821 + len )
140
+ end
141
+
85
142
def decode ( << @ map :: size ( 3 ) , len :: size ( 5 ) , part_rest :: binary >> , data_full ) do
86
143
decode_map ( part_rest , data_full , len )
87
144
end
@@ -126,9 +183,7 @@ defmodule MMDB2Decoder.Data do
126
183
127
184
# value decoding
128
185
129
- defp decode_array ( data_part , data_full , len ) do
130
- { data_part , size } = payload_len ( data_part , len )
131
-
186
+ defp decode_array ( data_part , data_full , size ) do
132
187
decode_array_rec ( data_part , data_full , size , [ ] )
133
188
end
134
189
@@ -143,16 +198,12 @@ defmodule MMDB2Decoder.Data do
143
198
end
144
199
145
200
defp decode_binary ( data_part , len ) do
146
- { data_part , len } = payload_len ( data_part , len )
147
-
148
201
<< value :: size ( len ) - binary , rest :: binary >> = data_part
149
202
150
203
{ value , rest }
151
204
end
152
205
153
- defp decode_map ( data_part , data_full , len ) do
154
- { data_part , size } = payload_len ( data_part , len )
155
-
206
+ defp decode_map ( data_part , data_full , size ) do
156
207
decode_map_rec ( data_part , data_full , size , % { } )
157
208
end
158
209
@@ -180,20 +231,4 @@ defmodule MMDB2Decoder.Data do
180
231
181
232
{ value , rest }
182
233
end
183
-
184
- # payload detection
185
-
186
- defp payload_len ( << len :: size ( 8 ) , data :: binary >> , 29 ) do
187
- { data , 29 + len }
188
- end
189
-
190
- defp payload_len ( << len :: size ( 16 ) , data :: binary >> , 30 ) do
191
- { data , 285 + len }
192
- end
193
-
194
- defp payload_len ( << len :: size ( 24 ) , data :: binary >> , 31 ) do
195
- { data , 65821 + len }
196
- end
197
-
198
- defp payload_len ( data , len ) , do: { data , len }
199
234
end
0 commit comments