LINUX.ORG.RU

История изменений

Исправление uin, (текущая версия) :

Короче, давай поговорим об этом в другой раз, ок?

Проблема решена следующим образом


var length = io.sampleFrames, channels = io.channels, data = $.getBytesArray('Uint8', byteOffset, byteLength)
   for (let i = 0, x = 0; i < length; i++) {
      for (let c = 0; c < channels; c++, x += 4)
         bufObj[c][i] = Bytes2Float32((data[x] << 24) + (data[(x + 1)] << 16) + (data[(x + 2)] << 8) + data[(x + 3)]);
   }

function Bytes2Float32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128) 
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);
} 


То есть преобразовывать следовало беззнаковые числа, о чем подсказал оригинальный код на Си
Вот теперь я вижу плюсы статической типизации

Тебе спасибо за наводку, я что то на ту страницу не натыкался при гуглении

Исправление uin, :

Короче, давай поговорим об этом в другой раз, ок?

Проблема решена следующим образом


var length = io.sampleFrames, channels = io.channels, data = $.getBytesArray('Uint8', byteOffset, byteLength)
   for (let i = 0, x = 0; i < length; i++) {
      for (let c = 0; c < channels; c++, x += 4)
         bufObj[c][i] = Bytes2Float32((data[x] << 24) + (data[(x + 1)] << 16) + (data[(x + 2)] << 8) + data[(x + 3)]);
   }
										}
function Bytes2Float32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128) 
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);
} 


То есть преобразовывать следовало беззнаковые числа, о чем подсказал оригинальный код на Си
Вот теперь я вижу плюсы статической типизации

Тебе спасибо за наводку, я что то на ту страницу не натыкался при гуглении

Исправление uin, :

Короче, давай поговорим об этом в другой раз, ок?

Проблема решена следующим образом


var length = io.sampleFrames, channels = io.channels, data = $.getBytesArray('Uint8', byteOffset, byteLength)
   for (let i = 0, x = 0; i < length; i++) {
      for (let c = 0; c < channels; c++, x += 4)
         bufObj[c][i] = Bytes2Float32((data[x] << 24) + (data[(x + 1)] << 16) + (data[(x + 2)] << 8) + data[(x + 3)]);
   }
										}
function Bytes2Float32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128) 
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);
} 


То есть преобразовывать следовало беззнаковые числа, о чем подсказал оригинальный код на Си
Вот теперь я вижу плюсы статической типазации

Тебе спасибо за наводку, я что то на ту страницу не натыкался при гуглении

Исходная версия uin, :

Короче, давай поговорим об этом в другой раз, ок?

Проблема решена следующим образом


var length = io.sampleFrames, channels = io.channels, data = $.getBytesArray('Uint8', byteOffset, byteLength)
   for (let i = 0, x = 0; i < length; i++) {
      for (let c = 0; c < channels; c++, x += 4)
         bufObj[c][i] = Bytes2Float32((data[x] << 24) + (data[(x + 1)] << 16) + (data[(x + 2)] << 8) + data[(x + 3)]);
   }
										}
function Bytes2Float32(bytes) {
    var sign = (bytes & 0x80000000) ? -1 : 1;
    var exponent = ((bytes >> 23) & 0xFF) - 127;
    var significand = (bytes & ~(-1 << 23));

    if (exponent == 128) 
        return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);

    if (exponent == -127) {
        if (significand == 0) return sign * 0.0;
        exponent = -126;
        significand /= (1 << 22);
    } else significand = (significand | (1 << 23)) / (1 << 23);

    return sign * significand * Math.pow(2, exponent);
} 


То есть преобразовывать следовало беззнаковые числа, о чем подсказал оригинальный код на Си
Вот теперь я вижу кое какие положительные от статической типазации

Тепбе спасибо за наводку, я что то на ту страницу не натыкался при гуглении