Skip to content

Commit ce3a58e

Browse files
committed
Add packBin function and implement pack for Value.Bin
1 parent 82c39fc commit ce3a58e

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

MsgPack.Test/MsgPack.Test.fs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,32 @@ module PackStringTest =
398398
sut.Length |> assertEqualTo 16909065
399399
sut.[0..4] |> assertEquivalentTo [| 0xDBuy; 0x01uy; 0x02uy; 0x03uy; 0x04uy |]
400400

401+
[<TestFixture>]
402+
module PackBinTest =
403+
[<Test>]
404+
let ``Given [| 0 .. 254 |] When packBin Then return byte[] and its format header is 0xC4 and its length is 257`` () =
405+
let sut = [| 0uy .. 254uy |] |> Packer.packBin
406+
sut.Length |> assertEqualTo 257
407+
sut.[0..1] |> assertEquivalentTo [| 0xC4uy; 0xFFuy |]
408+
409+
[<Test>]
410+
let ``Given [| 0 .. 255 |] When packBin Then return byte[] and its format header is 0xC5 and its length is 259`` () =
411+
let sut = [| 0uy .. 255uy |] |> Packer.packBin
412+
sut.Length |> assertEqualTo 259
413+
sut.[0..2] |> assertEquivalentTo [| 0xC5uy; 0x01uy; 0x00uy |]
414+
415+
[<Test>]
416+
let ``Given 65535-length bin array When packBin Then return byte[] and its format header is 0xC5 and its length is 65538`` () =
417+
let sut = Array.create 65535 0uy |> Packer.packBin
418+
sut.Length |> assertEqualTo 65538
419+
sut.[0..2] |> assertEquivalentTo [| 0xC5uy; 0xFFuy; 0xFFuy |]
420+
421+
[<Test>]
422+
let ``Given 65536-length bin array When packBin Then return byte[] and its format header is 0xC6 and its length is 65541`` () =
423+
let sut = Array.create 65536 0uy |> Packer.packBin
424+
sut.Length |> assertEqualTo 65541
425+
sut.[0..4] |> assertEquivalentTo [| 0xC6uy; 0x00uy; 0x01uy; 0x00uy; 0x00uy |]
426+
401427
[<TestFixture>]
402428
module PackArrayTest =
403429
[<Test>]

MsgPack/MsgPack.fs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ type Format =
2323
static member Nil = 0xC0uy
2424
static member False = 0xC2uy
2525
static member True = 0xC3uy
26+
static member Bin8 = 0xC4uy
27+
static member Bin16 = 0xC5uy
28+
static member Bin32 = 0xC6uy
2629
static member Ext8 = 0xC7uy
2730
static member Ext16 = 0xC8uy
2831
static member Ext32 = 0xC9uy
@@ -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

Comments
 (0)