星空下的213 2022-05-10 10:44 采纳率: 100%
浏览 72
已结题

设备上传文件base64,用java解码byte数组转float结果异常

问题遇到的现象和发生背景

设备端(C写的程序)上传消息服务器(java写的)直接存入文件,下载文件进行解码,其中转换int、String类型正常,转换float数据异常。

问题相关代码,请勿粘贴截图
public class demo {
    private static String device_log = "THlSYX4BAADRAQIAJQZRPwAAAEAlBlE/1nxoP0BX1j4t/n+/sIT0u1xlcj8fr6S+v1UDv0u+Wz8fyuY+XoRkP4ClXD/YzwG/WY05P75eMD8EQMC9nN5+vxpef7+Q3Y+9hYU+v2n9Kr9o0nc/FmGAPmv11b5ck2g/JxBAVbZ1TSG6UU3Y2TNNzzi2TGnIfUwTwYpMCwaWTCgl0EwkIRBOsBKJT5V7KFB5uE9PBfh8TdZWrk0XFh1PDpyIUG7oWFGMF4BRu2rNUKfxSU91cRZOgqgYTrAoS04js4tOs6xLTsX56k0OPjFOfOaATtLQDE547L9NQft/Tc8xIk50nkJPwmFcT74uNVAUIAxQrSaXTRXUQ09w2LJPI5hbT2hDr03pTXBNjwk8TlGKIE+eek9P8OFDT+OzKk6GuCFO4TBET7LtaU8P+Y5PWOQiT/JeiU1t3+VMQu4VTevEHU1pIbBNLFwnTejX3UxsBGhOOkMcT6iV1k4wygNO+RNdTZPItQ==";

    public static void main(String[] args) {
        byte[] bytes = null;                         //字节流
        try {
            bytes = EncodeUtil.decryptBASE64(device_log);
        } catch (Exception e) {
            e.printStackTrace();
        }
        byte[] arr = new byte[4];
        System.arraycopy(bytes, 0, arr, 0, 4);
        System.out.println("LyRa--------------------" + new String(arr, Charset.forName("GBK")));          //LyRa
        System.arraycopy(bytes, 0 + 4, arr, 0, 4);
        int count1 = ByteUtil.getIntLowEndian(arr);
        System.out.println("长度:-----------------------" + count1);                                         //长度
        System.out.println("标识符:--------------------" + "0x" + Integer.toHexString(bytes[8] & 0xFF));  //0xd1
        System.out.println("id:--------------------0x0"+ Integer.toHexString(bytes[ 9] & 0xFF));        //0x00---id
        byte[] arr2 = new byte[2];
        System.arraycopy(bytes, 10, arr2, 0, 2);
        System.out.println("valid_mask有效掩码-------------------------" + ByteUtil.getTiny(arr2));
        int count = 4;
        byte[] tmpByte = new byte[count];
        System.arraycopy(bytes, 16, tmpByte, 0, count);
        System.out.print(ByteUtil.getLowFloat(tmpByte));
        System.out.println("----"+bytes.length+"----");
        //字节序号1-4:Lyra
        //字节序号5-8:126 1 0 0
        //字节序号9:---转int----1----------转16进制---0x01
        //字节序号10-11:---转int---2.0
        //字节序号12-15:---转Float---0.8165 ---反角X
        //字节序号16-19:---转float---2.0 ---反角Y
        //字节序号20-23:---转float---0.8165 ---反角Z
        //字节序号24-27:---转float---0.90815485 ---I路补偿值
        //字节序号28-31:---转float---0.4186344 ---Q路补偿值
        //字节序号32-35: ---转float---(-0.99997216)
        //字节序号36-39:---转float--- (-0.0074621066)
        //字节序号40-43:---转float--- 0.9468591
        //字节序号44-47:---转float--- (-0.32164857)
        //字节序号48-51:---转float--- (-0.51302713)
        //字节序号52-55:---转float--- 0.8583724
        //字节序号56-59:---转float--- 0.4507608
        //字节序号60-63:---转float--- 0.89264476
        //字节序号64-67:---转float---  0.8619003
        //字节序号68-71:---转float--- (-0.5070777)
        //字节序号72-75:---转float---  0.72481304
        //字节序号76-79:---转float---  0.68894565
        //字节序号80-83:---转float--- (-0.0938721)
        //字节序号84-87:---转float--- (-0.99558425)
        //字节序号88-91:---转float--- (-0.9975296)
        //字节序号92-95:---转float--- (-0.070246816)
        //字节序号96-99:---转float--- (-0.74422485)
        //字节序号100-103:---转float---(-0.66792923)
        //字节序号104-107:---转float--- 0.9680543
        //字节序号108-111:---转float--- 0.2507407
        //字节序号112-115:---转float---(-0.41788802)
        //字节序号116-119:---转float---(0.9084985)
        //字符序号120:---转int---39---转16进制---0x27
        //字符序号121:---转int---16---转16进制---0x10
        //字符序号122:---转int---64---转16进制---0x40
        //字节序号4*Nr+199:   382-199=183
        //123-126
        for (int i = 123; i <=370 ; i+=4) {
            System.arraycopy(bytes, i, tmpByte, 0, count);
            System.out.print(byte2float(tmpByte,0)+"  ");
        }
    }
    /**
     * 将byte转换成float
     */
    public static float byte2float(byte[] b, int index) {
        int l;
        l = b[index + 0];
        l &= 0xff;
        l |= ((long) b[index + 1] << 8);
        l &= 0xffff;
        l |= ((long) b[index + 2] << 16);
        l &= 0xffffff;
        l |= ((long) b[index + 3] << 24);
        return Float.intBitsToFloat(l);
    }
}
运行结果及报错内容
LyRa--------------------LyRa
长度:-----------------------382
标识符:--------------------0xd1
id:--------------------0x01
valid_mask有效掩码-------------------------2
2.0----382----
2.57647952E8  2.19914768E8  1.88587392E8  9.553676E7  6.6527652E7  7.274716E7  7.8655576E7  1.09128E8  6.0452275E8  4.5994066E9  1.13066854E10  3.48497331E9  2.6525704E8  3.65615808E8  2.63547059E9  1.83354286E10  5.8225779E10  6.8768858E10  2.75705917E10  3.38805734E9  6.3100448E8  6.4029504E8  8.5211034E8  1.17188646E9  8.5427322E8  4.9277968E8  7.4340851E8  1.08129434E9  5.9062387E8  4.02493184E8  2.68416016E8  6.8029331E8  3.26516429E9  3.69739418E9  1.21589576E10  9.40365E9  3.16986784E8  3.28545613E9  6.0010578E9  3.68418074E9  3.67553792E8  2.5197736E8  7.8868576E8  2.69341926E9  3.48091955E9  3.28636416E9  7.1597894E8  6.7830618E8  3.29153766E9  3.92466893E9  4.797374E9  2.73287373E9  2.88087616E8  1.20519528E8  1.57213728E8  1.65433008E8  3.69372448E8  1.75489728E8  1.16309824E8  9.7315098E8  2.62165146E9  1.80006605E9  
我的解答思路和尝试过的方法
我想要达到的结果

base[4]转换float结果正常

  • 写回答

5条回答 默认 最新

  • 大锤爱编程 2022-05-10 11:05
    关注

    可以写一个直接的,就是输入的字符串是什么,输出的期望float是什么

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 创建了问题 5月10日

悬赏问题

  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle
  • ¥15 2024年全国大学生数据分析大赛A题:直播带货与电商产品的大数据分析 问题5. 请设计一份优惠券的投放策略,需要考虑优惠券的数量、优惠券的金额、投放时间段和投放商品种类等因素。求具体的python代码
  • ¥15 有人会搭建生鲜配送自营+平台的管理系统吗
  • ¥15 用matlab写代码
  • ¥30 motoradmin系统的多对多配置
  • ¥15 求组态王串口自定义通信配置方法或代码?
  • ¥15 实验 :UML2.0 结构建模