首页 文章

将十六进制答案转换为十二月?

提问于
浏览
2

我需要一些帮助,将我从汽车中的OBD适配器获得的答案转换为十进制,然后将转换后的任何值添加到公式并打印出来 .

private class ConnectedThread extends Thread {
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;
        private BluetoothSocket mmSocket;
        private ObdMultiCommand multiCommand;

        public ConnectedThread(BluetoothSocket socket) {
            connectionStatus = true;
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;          

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Log.v("e", "e");
            }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            OBDcmds();

            try {
                OdbRawCommand ANS= new OdbRawCommand("22 40 90");

                while (!Thread.currentThread().isInterrupted()) {

                    Log.d("Log", "ANS: " + ANS.getFormattedResult());

                    try {
                        ANS.run(mmInStream, mmOutStream);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("inside catch before while");
            }
        }

        private void OBDcmds() { // execute commands
            try {
                new TimeoutCommand(100).run(mmInStream, mmOutStream);
                new EchoOffCommand().run(mmInStream, mmOutStream);
                new LineFeedOffCommand().run(mmInStream, mmOutStream);
                new SelectProtocolCommand(ObdProtocols.ISO_15765_4_CAN).run(mmInStream, mmOutStream); //ISO_15765_4_CAN

                guiHandler(Constants.TOAST, Constants.SHORT, "Init Done");

            } catch (Exception e) {
                guiHandler(Constants.TOAST, Constants.SHORT, "Init Failed");
                // handle errors
            }
        }
    }

当被问到ANS时会返回类似"6240901F30"的内容,其中前6个数字与答案无关(6240901F30) . 所以我们剩下的是最后一个(在这种情况下)4个数字(1F30),它们是十六进制的,需要转换为十进制 . 然后将该值添加到公式 x * 0,0625 - 512 中 . 它需要跳过这六个第一个数字,否则答案是错误的 .

怎么看我的代码?

编辑:

因此,因为6个数字之后的值会根据汽车电池的电流而改变(这就是这个命令的作用),并且因为它处于while循环中,所以我对解决方案的解决方案感到很失落 . 其他命令只有3个最后需要计数的数字,因此在“计算”答案时只需要忽略6个第一个数字 .

编辑2:

我添加了一些代码以希望显示更多上下文 . 所有这些都是非gui课程 . 这个类处理蓝牙相关的所有东西,在我的其他类"MainActivity"处理gui,什么不是 . 希望这可能有点帮助 . OdbRawCommand ANS= new OdbRawCommand("22 40 28"); 这是来自pires obd-java API . 并且 OdbRawCommand 用于发送自定义命令,如'm doing right here. Here' s OdbRawCommand contains .

编辑3:

对很多编辑感到抱歉 . 但如果我修改了API中的OdbRawCommand类,它会工作吗?自 getFormattedResult 打印出它从汽车获得的原始答案 . 我可以编辑API OdbRawCommand类(如果可能的话)并执行类似的操作吗?但从它的外观来看,文件是锁定的,不能通过编辑?

enter image description here

@Override
    public String getFormattedResult() {
        int val = Integer.parseInt(getFormattedResult().substring(6), 16); //added this line
        return getResult();
    }

我今天没有车来测试这个,明天我会买的,但这会有用吗?

1 回答

  • 1

    使用 String#substring 提取最后四位数(调用 s ),然后是

    Integer.parseInt(s, 16)

    将其转换为整数 . 16告诉解析器 s 是十六进制的 .

相关问题