MessagePack,比json更小的编码方式详解


https://msgpack.org/
https://github.com/msgpack/msgpack/blob/master/spec.md#overview

    [MessagePack.MessagePackObject(true)]
    public class MesFoo 
    {
        [Key(3)]
        public int Age { set; get; } = 1;

    }

var mfoo = new MesFoo();

 var byteList = MessagePackSerializer.Serialize(mfoo);

在 [MessagePack.MessagePackObject(false)]
下 key01234  ...

91 01
fixarray    1001xxxx    0x90 - 0x9f
被当做 数组array
array类型 key 最大值区分
0-15
+--------+~~~~~~~~~~~~~~~~~+
|1001XXXX|    N objects    |
+--------+~~~~~~~~~~~~~~~~~+
16 - (2^16)-1
array 16 stores an array whose length is upto (2^16)-1 elements:
+--------+--------+--------+~~~~~~~~~~~~~~~~~+
|  0xdc  |YYYYYYYY|YYYYYYYY|    N objects    |
+--------+--------+--------+~~~~~~~~~~~~~~~~~+
(2^32)-1
array 32 stores an array whose length is upto (2^32)-1 elements:
+--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
|  0xdd  |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|    N objects    |
+--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+

一开始 长度位 
不存在用null 0xc0 填充。。  nil 11000000 0xc0 


fixmap    1000xxxx    0x80 - 0x8f
在 [MessagePack.MessagePackObject(true)]

被当做 Map字典

 [Key(0)]
 [Key(1)]
96  C0 C3 C0 C0 C0 A9 68 61 6E 62 69 6E 64 73 67

bool 类型
false:
+--------+
|  0xc2  |
+--------+
true:
+--------+
|  0xc3  |
+--------+

int类型
1, 2, 3, 5, or 9 bytes.

1位
0x00 - 0x7F 
是 0-127  0x00 - 0x7F 无符号整形   C# sbyte.MaxValue  

2位
+--------+--------+
|  0xcc  |ZZZZZZZZ|
+--------+--------+
是128-255 从0xCC 0x80到0xCC 0xFF

3位
+--------+--------+--------+
|  0xcd  |ZZZZZZZZ|ZZZZZZZZ|
+--------+--------+--------+

 是256 开始 0xCD 0x01 0x00 ,256 十六进制是 0100 (0x01 0x00 。2个字节)
以此类推

在 [MessagePack.MessagePackObject(true)] 
 KeyAttribute直接作废
public int Age { set; get; } = 1;
81 A3 41 67 65 01   
81是map字典长度  。fixmap    1000xxxx    0x80 - 0x8f
 A3 41 67 65  其中 A3 是string长度位。 fixstr    101xxxxx    0xa0 - 0xbf
41 67 65,其中0x41 大写字符A. A的ASCII码为65(0x41 );
 

代码参考https://lindexi.gitee.io/post/dotnet-%E4%BD%BF%E7%94%A8-MessagePack-%E5%BA%8F%E5%88%97%E5%8C%96%E5%AF%B9%E8%B1%A1.html

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值