星空下的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日

悬赏问题

  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止