【问题标题】:How do I convert a signed decimal value to a 32 bit little-endian binary string?如何将有符号十进制值转换为 32 位 little-endian 二进制字符串?
【发布时间】:2012-08-13 23:51:23
【问题描述】:

我需要将带符号的十进制数转换为 32 位 little-endian 二进制值。有没有人知道可以做到这一点的内置 Java 类或函数?或者已经建造了一个来做到这一点?

数据是经度/纬度值,例如 -78.3829。感谢您的帮助。

【问题讨论】:

  • 您想如何进行转换?圆形的?转换为 32 位十进制并假装它是整数?其他格式?
  • 像这样:round(-78.3829*100000),然后转换为 32 位小端二进制。
  • 那么您遇到的问题是什么?看起来不错。

标签: java binary


【解决方案1】:

如果它有帮助,这是我创建的一个类,它可以将 long 转换为二进制字符串,将二进制字符串转换为 long:

public class toBinary {

    public static void main(String[] args) {
        System.out.println(decimalToBinary(16317));
        System.out.println(binaryToDecimal("11111111111111111111111111111111111100101001"));
    }

    public static long binaryToDecimal(String bin) {
        long result = 0;
        int len = bin.length();
        for(int i = 0; i < len; i++) {
            result += Integer.parseInt(bin.charAt(i) +  "") * Math.pow(2, len - i - 1);
        }
        return result;
    }

    public static String decimalToBinary(long num) {
        String result = "";
        while(true) {
            result += num % 2;
            if(num < 2)
                break;
            num = num / 2;
        }
        for(int i = result.length(); i < 32; i++)
            result += "0";
        result = reverse(result);
        result = toLittleEndian(result);
        return result;
    }

    public static String toLittleEndian(String str) {
        String result = "";
        result += str.substring(24);
        result += str.substring(16, 24);
        result += str.substring(8, 16);
        result += str.substring(0, 8);
        return result;
    }

    public static String reverse(String str) {
        String result = "";
        for(int i = str.length() - 1; i >= 0; i--)
            result += str.charAt(i);
        return result;
    }

}

它不采用十进制值,但它可能会给你一些指导。

【讨论】:

  • decimalToBinary 返回的是小端值还是大端值?我需要一个小端值。如果它返回一个大端值,返回结果而不运行反向函数是否会将其返回为小端?
  • 我刚刚对其进行了编辑以使其返回一个小端值。然而,在没有反向函数的情况下返回结果不会以小端值(与我之前的值)的形式返回,因为字节序是按字节计算的,而不是按位计算的。
  • 谢谢。我一直遇到二进制问题。我要转换的值是经度和纬度坐标。纬度值始终为正,但经度值始终为负,因为它位于有限的地理区域内。您的代码只为经度值返回一个 0。 num &lt; 2 导致它在一次迭代后退出循环 break。我无意打扰,但您不会偶然知道如何将负数 long 转换为二进制数,对吗?
  • 要将负数 long 转换为二进制,只需将数字的绝对值转换为二进制,将所有 1 转换为 0,将 0 转换为 1,然后添加一个结果,你有一个负二进制数。我现在没有时间编写代码(我在工作),但真正唯一具有挑战性的部分是实现加法 1。我觉得我已经给了你足够的时间来解决这个问题你自己的。
  • 如果我理解您的问题,您应该将零添加到 positive 二进制字符串,然后翻转位,然后添加 1。有意义吗?
【解决方案2】:

一旦您知道字节序在二进制级别上的含义,转换就很简单了。问题更多的是你真的想用它做什么?

public static int flipEndianess(int i) {
    return (i >>> 24)          | // shift byte 3 to byte 0
           ((i >> 8) & 0xFF00) | // shift byte 2 to byte 1
           (i << 24)           | // shift byte 0 to byte 3
           ((i & 0xFF00) << 8);  // shift byte 1 to byte 2
}

这个小方法将交换 int 中的字节以在小/大端顺序之间切换(转换是对称的)。现在你有一个小字节序 int。但是你会用 Java 做什么呢?

您更有可能需要将数据写入流或其他东西,那么它只是一个问题,您以什么顺序写出字节:

// write int to stream so bytes are little endian in the stream
// OutputStream out = ... 
out.write(i);
out.write(i >> 8);
out.write(i >> 16);
out.write(i >> 24);

(对于大端,您只需从下到上排列行...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2014-05-20
    • 2023-03-20
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    相关资源
    最近更新 更多