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

设备上传文件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日

悬赏问题

  • ¥15 帮我调试idea基于spring boot项目
  • ¥15 es 7.17.20版本生成时间戳
  • ¥15 wpf dategrid表头排序图标自定义
  • ¥15 分析下图所示同步时序逻辑电路的逻辑功能。
  • ¥15 halcon联合c#遇到了问题不能解决
  • ¥15 xshell无法连接提示ssh服务器拒绝密码
  • ¥15 AT89C52单片机C语言关于串口通信的位操作
  • ¥20 需要步骤截图(标签-服务器|关键词-map)
  • ¥50 gki vendor hook
  • ¥15 灰狼算法和蚁群算法如何结合