想个办法在 float 型 4 字节中嵌入校验信息,哪位牛人能出个方案帮帮我? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
warmheartli
V2EX    程序员

想个办法在 float 型 4 字节中嵌入校验信息,哪位牛人能出个方案帮帮我?

  •  
  •   warmheartli
    lcdevelop 2017-01-11 13:38:20 +08:00 3345 次点击
    这是一个创建于 3199 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在开发我的聊天机器人程序时遇到一个特殊的问题:因为我的存储系统可能存在 bug ,写入数据读出来可能不对(小概率) 所以我希望在 float 的 4 个字节中嵌入我的校验信息,达到这种效果:

    1. 我能解码出这个 float 的原始值
    2. 我能通过校验信息判断这个 float 是不是我真实写入的

    请问哪位大神能帮我?

    17 条回复    2017-02-03 08:24:21 +08:00
    enenaaa
        1
    enenaaa  
       2017-01-11 13:46:50 +08:00
    检验数据可以附在正常数据后面。 为啥非得在 float 格式上较真?
    warmheartli
        2
    warmheartli  
    OP
       2017-01-11 13:57:32 +08:00
    @enenaaa 因为我不知道是不是存储系统的 bug ,也可能是我程序的 bug ,所以如果要是附加到正常数据后面,那这里的“正常数据”有可能已经是错的了
    kysida
        3
    kysida  
       2017-01-11 13:59:48 +08:00
    楼上+1 ,你的校验数据可以放在你的数据后面或者前面作为一个 flag
    Kilerd
        4
    Kilerd  
       2017-01-11 14:17:02 +08:00 via iPhone
    那你需要重新定义中新的 float ,底层储存方式都要重新设计。加油,少年。

    最简单的就是奇偶检验,其他的检验方式看回科班的书吧。
    canfoderiskii
        5
    canfoderiskii  
       2017-01-11 14:22:40 +08:00 via Android
    你动了 float 的内部格式还怎么满足 ieee754 标准
    knightdf
        6
    knightdf  
       2017-01-11 14:25:52 +08:00
    我们曾经用 redis 时也出现了这个 BUG ,后来。。。恩,确实是程序的 BUG ,不能怪 redis
    dallaslu
        7
    dallaslu  
       2017-01-11 14:37:49 +08:00   1
    float 的前八位是指数位,后 24 位是尾数。

    你可以牺牲尾数精度,来占用最右的 n 个 bits 来写入你的校验信息。或者占用第 9 位到第 9+n 位。

    在写入和读取时都需要有这种处理转换,以保证程序在内存中使用的依然是标准的、准确的 float 。

    float 与 byte[] 转换可参考: http://blog.csdn.net/cshichao/article/details/9813973
    warmheartli
        8
    warmheartli  
    OP
       2017-01-11 14:42:37 +08:00
    我先说一个我想的方案,大家帮我参谋一下,因为我确定我的 float 的取值范围最大不会超过 2^30 ,所以我把浮点数加上固定的 2^30+2^32+2^34+2^36 ,读的时候我就看我的浮点数减去 2^30+2^32+2^34+2^36 得的数是不是在正负 2^30 之间,还有没有别的办法?
    v2dead
        9
    v2dead  
       2017-01-11 15:00:19 +08:00
    为什么不老老实实用 crc 一类的校验码呢。回去看看科班的书还是有用的。附加在数据后面,即使校验码错了也一样的。
    xiao17174
        10
    xiao17174  
       2017-01-11 16:07:17 +08:00
    不知道你怀疑的存储的 BUG 是什么粒度的?位级别?不如直接每次存 float 就存两次?
    lucifer9
        11
    lucifer9  
       2017-01-11 16:58:49 +08:00
    遇到这种情况,正常的想法不是赶紧换硬盘换内存么?
    mxi1
        12
    mxi1  
       2017-01-11 17:09:58 +08:00 via iPhone
    按照 float 类型存储的数据是允许有误差的,并不是硬件的问题。
    @lucifer9
    SmiteChow
        13
    SmiteChow  
       2017-01-11 17:11:31 +08:00
    一个问号?既然你存储系统有问题,你的校验特征码即便算出来了,和你想存储的东西混一起了,读出来也会有问题啊
    pmispig
        14
    pmispig  
       2017-01-11 18:27:47 +08:00
    单字节异或得出值到第 5 个字节
    warmheartli
        15
    warmheartli  
    OP
       2017-01-11 18:36:36 +08:00
    @dallaslu 靠谱
    fffflyfish
        16
    fffflyfish  
       2017-02-02 11:21:29 +08:00
    @warmheartli shareditor.com 这个网站挂掉了,还会再开吗?( v 站没有私信的方式,我就随便找了一个您的帖子,恕我冒昧~)
    warmheartli
        17
    warmheartli  
    OP
       2017-02-03 08:24:21 +08:00
    @fffflyfish 除了点故障,已经恢复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5900 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 43ms UTC 02:19 PVG 10:19 LAX 19:19 JFK 22:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86