Skip to content

Commit 344b73e

Browse files
committed
support encoding variant of null array
1 parent 727d420 commit 344b73e

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

opcua/ua/uatypes.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -821,10 +821,11 @@ def __str__(self):
821821
def to_binary(self):
822822
b = []
823823
encoding = self.VariantType.value & 0b111111
824-
if type(self.Value) in (list, tuple):
824+
if self.is_array or type(self.Value) in (list, tuple):
825+
self.is_array = True
826+
encoding = uabin.set_bit(encoding, 7)
825827
if self.Dimensions is not None:
826828
encoding = uabin.set_bit(encoding, 6)
827-
encoding = uabin.set_bit(encoding, 7)
828829
b.append(uabin.Primitives.UInt8.pack(encoding))
829830
b.append(uabin.pack_uatype_array(self.VariantType, flatten(self.Value)))
830831
if self.Dimensions is not None:
@@ -842,8 +843,6 @@ def from_binary(data):
842843
encoding = ord(data.read(1))
843844
int_type = encoding & 0b00111111
844845
vtype = datatype_to_varianttype(int_type)
845-
if vtype == VariantType.Null:
846-
return Variant(None, vtype, encoding)
847846
if uabin.test_bit(encoding, 7):
848847
value = uabin.unpack_uatype_array(vtype, data)
849848
array = True
@@ -886,7 +885,9 @@ def flatten_and_get_shape(mylist):
886885

887886

888887
def flatten(mylist):
889-
if len(mylist) == 0:
888+
if mylist is None:
889+
return None
890+
elif len(mylist) == 0:
890891
return mylist
891892
while isinstance(mylist[0], (list, tuple)):
892893
mylist = [item for sublist in mylist for item in sublist]

tests/tests_unit.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@ class TestUnit(unittest.TestCase):
2525
Simple unit test that do not need to setup a server or a client
2626
'''
2727

28+
def test_variant_array_none(self):
29+
v = ua.Variant(None, varianttype=ua.VariantType.Int32, is_array=True)
30+
data = v.to_binary()
31+
v2 = ua.Variant.from_binary(ua.utils.Buffer(data))
32+
self.assertEqual(v, v2)
33+
self.assertTrue(v2.is_array)
34+
35+
v = ua.Variant(None, varianttype=ua.VariantType.Null, is_array=True)
36+
data = v.to_binary()
37+
v2 = ua.Variant.from_binary(ua.utils.Buffer(data))
38+
self.assertEqual(v, v2)
39+
self.assertTrue(v2.is_array)
40+
2841
def test_custom_structs(self):
2942
xmlpath = "tests/example.bsd"
3043
c = StructGenerator(xmlpath, "structures.py")

0 commit comments

Comments
 (0)