2016-06-08 42 views
0

我想将当前时间设置为信标的主要和次要值。让我们假设这是当前时间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的结果,我认为这些值被转换成大端。我感到困惑,我不太了解哪种类型,以及如何转换字符串。

+0

我知道这不是问题的关键,但请注意,test.sh文件具有非法字节值,如“j2”“j9”“n9”“g7”v7“。十六进制值只能包含字符0-9和af。字符j,n,g和v不合法,会导致问题 – davidgyoung

+0

谢谢你的评论! – Celiiine

回答

0

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

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

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); 

上面的代码访问的每个字节出时间戳并将其分配给适当的字段,然后格式化它作为双字符(一个字节)的十六进制数。两个字符的十六进制数字就是你想要的脚本。

+0

谢谢,但它不能正常工作,例如:Time = 1465471852025,Hex = 55 ED DD F9,Major = 21997,Minor = 63941。我找不到你的代码中的错误。 – Celiiine

+0

对你来说看起来不正确? – davidgyoung

+0

正如我所解释的,我想要最后8个数字的时间14654 ** 71852025 **是主要和次要的值,所以主要应该是7185和未成年人2025当我发现他们而不是21997和63941. – Celiiine

相关问题