【问题标题】:Converting Hex answer to Dec?将十六进制答案转换为十二月?
【发布时间】:2016-05-16 08:46:21
【问题描述】:

我需要一些帮助,将我从汽车中的 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 APIOdbRawCommand 被用来发送自定义命令,就像我在这里做的那样。这是OdbRawCommand contains

编辑 3:

很抱歉进行了许多修改。但是如果我修改了 API 中的 OdbRawCommand 类,它会起作用吗?因为getFormattedResult 打印出它从车上得到的原始答案。我可以编辑 API OdbRawCommand 类(如果可能的话)并做这样的事情吗?但是从外观上看,文件已被锁定,无法编辑?

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

我今天没有车来测试这个,我明天去拿,但这行得通吗?

【问题讨论】:

    标签: java android obd-ii


    【解决方案1】:

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

    Integer.parseInt(s, 16)

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

    【讨论】:

    • 这听起来很有希望!你介意向我展示我的代码中的样子吗,或者举个例子?
    • 我认为无论长度如何,OP都希望跳过前6位。
    • @swess 试试int val = Integer.parseInt(str.substring(6), 16);.
    • @shmosel 这可能是个愚蠢的问题,哈哈。但是我会放这行代码吗,str应该是什么?谢谢:)
    • @shmosel 我添加了更多上下文,检查“编辑 2:”。我忘了提及我正在使用的 API。希望这能提供更多背景信息。
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2020-02-19
    • 1970-01-01
    • 2016-08-28
    • 2013-07-25
    相关资源
    最近更新 更多