二进制协议要如何设计才能提高使用率?

2020-03-09 16:22:56 +08:00
 wbing
比如当前我有 A,B,C,D,E,F,G,H 这 8 种错误类型,每种类型都有 true 和 false 两种状态。
每条协议需要返回所有错误类型的状态。
我现在的设计是通过 1 个字节去表示,每种状态占一位,0 为 false,1 为 true,来表示这 8 种错误,但后面如果类型增多,那么 1 个字节就不够用了。

所以我想问下有没有更好的设计,可以使这 1 个字节,存放更多的类型??
4459 次点击
所在节点    编程
10 条回复
whywhywhy
2020-03-09 16:26:13 +08:00
第 8 个位不使用,当第 8 个位为 1 的时候,启用第二个字节,以此类推
lcdtyph
2020-03-09 16:28:35 +08:00
如果错误类型很多的话是不是设计单独的错误帧比较好呢
kizunai
2020-03-09 16:29:25 +08:00
哈夫曼编码
swulling
2020-03-09 16:30:56 +08:00
直接预留 2 个字节不就可以了
hhhsuan
2020-03-09 16:38:55 +08:00
用两个字节或更多,别把问题搞复杂
noe132
2020-03-09 19:09:37 +08:00
8bit 除非打破存放超过 8bit 的信息?除非你的比特能表示 3 种状态
also24
2020-03-09 19:11:25 +08:00
楼主可以看一下 utf-8 是如何实现的 『变长编码』。

// 其实就是一楼说的那样
Yourshell
2020-03-09 19:14:27 +08:00
8^2 还不够吗
also24
2020-03-09 19:18:43 +08:00
想了一下,有个地方好像我想当然了。

楼主这里需要补充一个信息:
这 8 种错误是否他互斥的?是否会有同时出现的情况?

如果说是互斥的,只有其中一种会出现,那你实际上需要保存的只是 1 个数字, 那 8 bit 足够你保存 256 个数字了。

如果说,各种错误并不互斥,可以同时出现,那就是我在 7 楼说的情况。
Mohanson
2020-03-09 19:25:17 +08:00
建议重新设计自己的二进制协议减少错误数量, 我看过一些二进制网络协议像 socks4/socks5, 错误数量个数普遍在 10 个以内, 但均使用一个 byte 表示.

换个角度想想, 如果你的二进制协议单单不同的错误类型就超过 256 个, 这个"协议"已经臃肿的不像话了吧, **更像是应用层而非协议层**.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/651239

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX