V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
warmheartli
V2EX  ›  程序员

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

  •  
  •   warmheartli ·
    lcdevelop · Jan 11, 2017 · 3593 views
    This topic created in 3399 days ago, the information mentioned may be changed or developed.

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

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

    请问哪位大神能帮我?

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

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

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

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

    float 与 byte[] 转换可参考: http://blog.csdn.net/cshichao/article/details/9813973
    warmheartli
        8
    warmheartli  
    OP
       Jan 11, 2017
    我先说一个我想的方案,大家帮我参谋一下,因为我确定我的 float 的取值范围最大不会超过 2^30 ,所以我把浮点数加上固定的 2^30+2^32+2^34+2^36 ,读的时候我就看我的浮点数减去 2^30+2^32+2^34+2^36 得的数是不是在正负 2^30 之间,还有没有别的办法?
    v2dead
        9
    v2dead  
       Jan 11, 2017
    为什么不老老实实用 crc 一类的校验码呢。回去看看科班的书还是有用的。附加在数据后面,即使校验码错了也一样的。
    xiao17174
        10
    xiao17174  
       Jan 11, 2017
    不知道你怀疑的存储的 BUG 是什么粒度的?位级别?不如直接每次存 float 就存两次?
    lucifer9
        11
    lucifer9  
       Jan 11, 2017
    遇到这种情况,正常的想法不是赶紧换硬盘换内存么?
    mxi1
        12
    mxi1  
       Jan 11, 2017 via iPhone
    按照 float 类型存储的数据是允许有误差的,并不是硬件的问题。
    @lucifer9
    SmiteChow
        13
    SmiteChow  
       Jan 11, 2017
    一个问号?既然你存储系统有问题,你的校验特征码即便算出来了,和你想存储的东西混一起了,读出来也会有问题啊
    pmispig
        14
    pmispig  
       Jan 11, 2017
    单字节异或得出值到第 5 个字节
    warmheartli
        15
    warmheartli  
    OP
       Jan 11, 2017
    @dallaslu 靠谱
    fffflyfish
        16
    fffflyfish  
       Feb 2, 2017
    @warmheartli shareditor.com 这个网站挂掉了,还会再开吗?( v 站没有私信的方式,我就随便找了一个您的帖子,恕我冒昧~)
    warmheartli
        17
    warmheartli  
    OP
       Feb 3, 2017
    @fffflyfish 除了点故障,已经恢复
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   979 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 23:41 · PVG 07:41 · LAX 16:41 · JFK 19:41
    ♥ Do have faith in what you're doing.