V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wbing
V2EX  ›  编程

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

  •  
  •   wbing · 2020-03-09 16:22:56 +08:00 · 4537 次点击
    这是一个创建于 1731 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如当前我有 A,B,C,D,E,F,G,H 这 8 种错误类型,每种类型都有 true 和 false 两种状态。
    每条协议需要返回所有错误类型的状态。
    我现在的设计是通过 1 个字节去表示,每种状态占一位,0 为 false,1 为 true,来表示这 8 种错误,但后面如果类型增多,那么 1 个字节就不够用了。

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

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

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

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

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

    换个角度想想, 如果你的二进制协议单单不同的错误类型就超过 256 个, 这个"协议"已经臃肿的不像话了吧, **更像是应用层而非协议层**.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5859 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:23 · PVG 10:23 · LAX 18:23 · JFK 21:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.