Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中将十六进制转换为纬度和经度时出错_Java_Latitude Longitude_Numberformatexception - Fatal编程技术网

在java中将十六进制转换为纬度和经度时出错

在java中将十六进制转换为纬度和经度时出错,java,latitude-longitude,numberformatexception,Java,Latitude Longitude,Numberformatexception,十六进制字符串->090bc3b3ed1b479c 我想把它转换成经纬度。实际产量为 纬度十六进制::090bc3b3 纬度:42.1572052777784 经度十六进制::ed1b479c 经度:::-88.049805555 当我试图转换成整数值时,我得到NumberFormatException。以下是我正在编写的代码: 我得到异常我转换经度十六进制字符串为整数 public String getLatitude(String hex) { int latStart=0

十六进制字符串->090bc3b3ed1b479c

我想把它转换成经纬度。实际产量为 纬度十六进制::090bc3b3 纬度:42.1572052777784

经度十六进制::ed1b479c 经度:::-88.049805555

当我试图转换成整数值时,我得到NumberFormatException。以下是我正在编写的代码:

我得到异常我转换经度十六进制字符串为整数

 public String getLatitude(String hex) {
        int latStart=0;
        String str09 = hex.substring(latStart,latStart+8);
        System.out.println("latitude Hex::"+str09);
        Integer outDec = Integer.parseInt(str09, 16);
        double d = outDec / new Double(1000);
        System.out.println("Hex to float>>>" + d);
        double lat = d /`enter code here` 3600;
        return String.valueOf(lat);
    }

public String getLongitude(String hex) throws Exception {
    int lonStart=8;
    String str09 = hex.substring(lonStart,lonStart+8);
    System.out.println("Longitude Hex::"+str09);
    Integer outDec = Integer.parseInt(str09,16);
    double d = outDec / new Double(1000);
    System.out.println("Hex to float>>>" + asHex);
    double lon = d / 3600;
    return String.valueOf(lon);
} 

我也尝试了Long,但得到的结果是:经度:1104.9966655555554

问题在于解析负值。使用090bc3b3ed1b479c字符串作为输入,您可能会得到NumberFormatException:对于输入字符串:ed1b479c,因为该数字太大,无法存储在int中

Java 8添加了Integer.parseUnsignedInt,这将解决您的问题,更改为无符号转换后的输出:

public String getLongitude(String hex) throws Exception {
    int lonStart=8;
    String str09 = hex.substring(lonStart,lonStart+8);
    System.out.println("latitude Hex::"+str09);
    System.out.println("Longitude Hex::"+str09);
    Long outDec = Long.parseLong(str09, 16);
    double d = outDec / new Double(1000);
    System.out.println("Hex to float>>>" + d);
    double lon = d / 3600;
    return String.valueOf(lon);
}
请注意,Integer.parseUnsignedInt仍将返回带符号的int,但它会将输入字符串视为无符号

编辑:

对于Java 8之前的版本,问题:

latitude Hex::090bc3b3
Hex to float>>>151765.939
Lat: 42.157205277777784

Longitude Hex::ed1b479c
Hex to float>>>-316979.3
Lon: -88.04980555555555

为什么您的参数在第二个getLongiture方法中命名为base64?您使用的是base64编码吗?我得到的输入是转换为十六进制字符串的base64字符串。。我比较了编码前和解码后base64的十六进制字符串,看起来不错。但问题在于将十六进制字符串转换为带符号的十进制值。我现在已经将变量名更改为hex。java 7中有解决方案吗?我目前正在使用java 7
int value = (int) Long.parseLong(yourSringHere, 16);