从millis转换为hex String

时间:2016-06-08 15:46:02

标签: java ibeacon ibeacon-android android-ibeacon

我想将当前时间设置为信标的主要值和次要值。让我们假设这是当前时间1465398279009。我希望9827是主要的值,并且9009是未成年人的值。我使用java代码来调用shell脚本。这是我的java代码

Long millis = System.currentTimeMillis();
            String time=Long.toString(millis);
           // String major1=time.substring(...);
            String major1="99";
            String major2="99";
            String minor1="99";
            String minor2="99";
  ProcessBuilder pb2=new ProcessBuilder("/test.sh");
            pb2.environment().put("major1", major1);
            pb2.environment().put("major2", major2);
            pb2.environment().put("minor1", minor1);
            pb2.environment().put("minor2", minor2);
            Process script_exec = pb2.start();

这是test.sh的内容

sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 e2 c5 6d sd fh fb 33 j2 k9 j9 23 h2 n9 g7 v7 $param1 $major1 $major2 $minor1 $minor2 c5 00

在此示例中,我只是尝试将两个值都放到99999999,但我得到39321,我认为这些值会转换为大端。我感到困惑,我不清楚哪种类型,以及如何转换字符串。

2 个答案:

答案 0 :(得分:0)

Long.toString可以带两个参数。第一个参数是数字,第二个参数是转换的基数。

使用16(Long.toString(millis, 16))的基数将导致使用[1-9a-f]的标准十六进制字符串。

答案 1 :(得分:0)

试试这个:

 String major1 = String.format("%02X", (millis >> 32) & 0xff);
 String major2 = String.format("%02X", (millis >> 16) & 0xff);
 String minor1 = String.format("%02X", (millis >> 8) & 0xff);
 String minor2 = String.format("%02X", millis & 0xff);

上面的代码访问时间戳中的每个字节并将其分配给正确的字段,然后将其格式化为两个字符(一个字节)十六进制数。两个字符的十六进制数字是您想要的脚本。