Arhn - архитектура программирования

Как преобразовать десятичное значение со знаком в 32-битную двоичную строку с прямым порядком байтов?

Мне нужно преобразовать десятичное число со знаком в 32-битное двоичное значение с прямым порядком байтов. Кто-нибудь случайно знает встроенный класс или функцию Java, которая может это сделать? Или построили для этого?

Данные представляют собой значение долготы/широты, например -78,3829. Спасибо за любую помощь.

03.08.2012

  • Как вы хотите сделать преобразование? Круглый? Преобразовать в 32-битное десятичное число и представить, что это целое число? Какой-то другой формат? 03.08.2012
  • например: round(-78.3829*100000), а затем преобразовать в 32-битный двоичный код с прямым порядком байтов. 03.08.2012
  • Так в чем проблема у тебя с этим? Кажется, все в порядке. 03.08.2012

Ответы:


1

Если это вообще поможет, вот класс, который я сделал, который преобразует длинные строки в двоичные строки и двоичные строки в длинные:

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

}

Он не принимает десятичных значений, но, вероятно, может дать вам некоторое руководство.

03.08.2012
  • возвращает ли decimalToBinary значение с прямым порядком байтов или значение с прямым порядком байтов? Мне нужно небольшое значение endian. Если он возвращает значение с прямым порядком байтов, будет ли возвращаемый результат без запуска обратной функции возвращать его как обратный порядок байтов? 13.08.2012
  • Я только что отредактировал его, чтобы он возвращал небольшое значение endian. Однако возврат результата без обратной функции не вернул бы его как значение с прямым порядком байтов (с тем, что у меня было раньше), поскольку порядок байтов идет по байтам, а не по битам. 13.08.2012
  • Спасибо. У меня всегда были проблемы с двоичным кодом. Значения, которые я конвертирую, - это координаты долготы и широты. Значения широты всегда положительны, а значения долготы всегда отрицательны, т. к. это находится в пределах ограниченной географической области. Ваш код возвращает только один 0 для значений долготы. num < 2 заставляет его break выйти из цикла после одной итерации. Я не хочу вас беспокоить, но вы случайно не знаете, как преобразовать отрицательное long число в двоичное, не так ли? 13.08.2012
  • Чтобы преобразовать отрицательное long в двоичное, все, что вам нужно сделать, это преобразовать абсолютное значение числа в двоичное, переключить все 1 на 0 и 0 на 1, а затем добавить единицу к результату, и вы получили себя отрицательное двоичное число. У меня нет времени кодировать это прямо сейчас (я на работе), но на самом деле единственной сложной частью будет реализация добавления 1. Я чувствую, что дал вам достаточно, чтобы понять это. твой собственный. 13.08.2012
  • Я действительно ценю твою помощь. Код разработаю сам. Как я уже сказал, у меня всегда были проблемы с двоичным кодом. Спасибо. 13.08.2012
  • Да, с бинарником не так просто работать. Рад, что смог помочь! 13.08.2012
  • Джек, быстрый вопрос, если ты не против. Мне нужно, чтобы двоичное число было 32-битным. поэтому для отрицательного числа я взял абсолютное значение, преобразовал в двоичное (что дало мне 22-битную двоичную строку), запустил обратную функцию, чтобы она была в правильном порядке, затем я оставил добавленное необходимое количество нулей, чтобы сделать это 32 бита. Затем я сделал битовый переключатель, как вы сказали, и добавил 1. Мой вопрос заключается в том, должен ли я сделать битовый переключатель, а затем оставить нули, или я должен сначала заполнить нули, как я делаю сейчас? 15.08.2012
  • Если я понимаю ваш вопрос, вы должны добавить нули к двоичной строке positive, ЗАТЕМ перевернуть биты, ЗАТЕМ добавить 1. Имеет смысл? 15.08.2012
  • Да. Это то, что я делаю. Я просто хотел убедиться, что это правильно. Огромное спасибо. 15.08.2012

  • 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, чтобы переключаться между порядком следования байтов от младшего к старшему (преобразование симметрично). Теперь у вас есть немного endian 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);
    

    (Для прямого порядка байтов вы просто заказываете строки снизу вверх...)

    03.08.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..