Преобразование 64-битного шестнадцатеричного числа в десятичное с плавающей запятой в Javascript

#javascript

#javascript

Вопрос:

Итак, в основном у меня есть пара чисел, которые отображаются в виде шестнадцатеричных значений в форме «3FF0000000000000», и я хочу получить из них значения с плавающей запятой, почти такие же, как здесь, поэтому в данном конкретном случае я бы ожидал в результате «20.000000000000000», которые я позже урежу только до 5 десятичные дроби, но это должно быть достаточно просто.

Я попробовал несколько решений, но, к сожалению, я слишком мало знаю о конверсиях (и javascript в том числе), чтобы точно знать, что я могу делать неправильно.

Последняя попытка выглядит примерно так:

 const hexToFloat64 = (hex) => {
    var int32 = [],
        float64;
    if (hex.length > 4) {
        var high = hex.substr(0, 8),
            low = hex.substr(8, 8);
        int32.push(parseInt(high, 16), parseInt(low, 16));
    }

    var uint32 = new Uint32Array(int32);
    float64 = new Float64Array(uint32.buffer);
    var returnValue = float64[0];
    return returnValue;
};
 

Премного благодарен!

Комментарии:

1. Возможны все преобразования по числовым типам данных. Есть ли у вас «спецификация» от origin до dest, которой вы могли бы поделиться? ……… 64-битное шестнадцатеричное или любое шестнадцатеричное число, скорее всего, преобразуется в «целое число». Или иным образом, не подходит для преобразования и представляет собой «структуру данных».

2. @GetSet Извините, но я не совсем уверен, что вы имеете в виду под «спецификацией от источника до dest для совместного использования». В принципе, у меня есть пара значений, закодированных (вне моей досягаемости) как шестнадцатеричные, и мне просто нужно интерпретировать их как значения с плавающей запятой, чтобы отобразить их в представлении. У меня были другие значения в виде «43CAA727», но для них мне, к счастью, удалось найти решение.

3. ОК. Я понимаю. Представление шестнадцатеричного числа в виде числа с плавающей запятой, вероятно, является тупиковым. Сам шестнадцатеричный код является либо десятичным числом, либо его структурой данных. Я думаю, требуется больше контекста для того, откуда берутся эти значения?

4. Для дальнейшей «просвещенной» помощи вам нужно будет хотя бы частично указать, как вы вообще получили шестнадцатеричные данные. Таким образом, можно решить, является ли то, что вы видите как шестнадцатеричное, на самом деле не числом, а объединенными данными, как в структуре данных.

5. Однако это ни в коем случае не было бы «плавающим». Поплавок предназначен для приближений. Там никто не хранит определенные данные.

Ответ №1:

Это НЕ ответ на вашу конкретную проблему. Это решение для расшифровки шестнадцатеричного числа. Это все, что я здесь делаю. У меня нет контекста для решения вашей проблемы.

 function convHexStringToString(ss) {
// ss length must be even (or 0) when passed to this function
    var s = "";
    var p;
    if (ss.length > 0) {
        if (ss.length % 2 == 0) {
            
            var l = Math.floor(ss.length / 2); // floor must never have to do work
            
            for (var i = 0; i < l; i  ) { 
                var i2 = i * 2;
                if (ss.charAt(i2) != "0") {
                    p = ss.charAt(i2)   ss.charAt((i2)   1);
                }
                else {
                    p = ss.charAt((i2)   1);
                }
                d = parseInt(p,16);
                s  = String.fromCharCode(d);
            }
        }
    }
    return s;
}
 

Комментарии:

1. Спасибо за ответ! Хотя это не решило мою проблему, это дало мне несколько советов о том, как дальше обдумывать проблему. Я также попытаюсь выяснить, как создаются эти шестнадцатеричные значения. Еще раз спасибо за ваше время!