@@ -23,6 +23,9 @@ type Format =
2323 static member Nil = 0xC0 uy
2424 static member False = 0xC2 uy
2525 static member True = 0xC3 uy
26+ static member Bin8 = 0xC4 uy
27+ static member Bin16 = 0xC5 uy
28+ static member Bin32 = 0xC6 uy
2629 static member Ext8 = 0xC7 uy
2730 static member Ext16 = 0xC8 uy
2831 static member Ext32 = 0xC9 uy
@@ -286,6 +289,23 @@ module Packer =
286289 byte ( length &&& 0x000000FF ) |]
287290 bytes // string whose length is greater than 2^16-1.
288291
292+ [<CompiledName( " PackBinary" ) >]
293+ let packBin ( bs : byte []) =
294+ let length = bs.Length
295+ if length <= 255 then Array.append [| Format.Bin8; byte( length) |] bs
296+ elif length <= 65535 then Array.append
297+ [| Format.Bin16
298+ byte (( length &&& 0xFF00 ) >>> 8 )
299+ byte ( length &&& 0x00FF ) |]
300+ bs
301+ else Array.append
302+ [| Format.Bin32
303+ byte (( length &&& 0xFF000000 ) >>> 24 )
304+ byte (( length &&& 0x00FF0000 ) >>> 16 )
305+ byte (( length &&& 0x0000FF00 ) >>> 8 )
306+ byte ( length &&& 0x000000FF ) |]
307+ bs
308+
289309 [<CompiledName( " PackExtended" ) >]
290310 let packExt ( t : sbyte ) ( bs : byte []) =
291311 let length = bs.Length
@@ -324,7 +344,7 @@ module Packer =
324344 | Value.Int32 i -> packInt i
325345 | Value.Int64 i -> packInt64 i
326346 | Value.String s -> packString s
327- | Value.Bin b -> [||]
347+ | Value.Bin b -> packBin b
328348 | Value.Array arr ->
329349 let fmapped = Array.collect pack arr
330350 let length = arr.Length
0 commit comments