2015-12-17 1 views
0

Есть ли простой способ преобразования байтового массива из N байтов в поплавок, определяемый Q-номером.Преобразование N-байтов в Float, определяемое Q-номером

В 2-х в Compliment (забыл упомянуть об этом раньше)

Пример: 0xFFF0 -> Float-точка с использованием s3.12 Q-номер

https://en.wikipedia.org/wiki/Q_(number_format)

+0

Read 2 байта шорты, извлечь знак, разделить на 4096.0 и использование '-' если отрицательный. –

+0

Что вы понимаете, прочитав 2 байта? Я понимаю «разделение на 4096» 2^12. – MoMan

+0

Q-номер 's3.12' - 16 бит, ака 2 байта, поэтому чтение 2 байтов из массива в виде короткого значения. Вы не можете прочитать все байты из массива N-байтов как один Q-номер 's3.12'. – Andreas

ответ

1

По предложению Питера Lawrey:

private static void test(short x) { 
    float y = (float)(x & 0x7FFF)/(1 << 12); 
    if ((x & 0x8000) != 0) 
     y = -y; 
    System.out.printf("%04x: %g%n", x, y); 
} 

Test

test((short)0xFFF0); 
test((short)0xFFFF); 
test((short)0x0000); 
test((short)0x0001); 
test((short)0x1000); 
test((short)0x9000); 
test((short)0x7FFF); 

Выход

fff0: -7.99609 
ffff: -7.99976 
0000: 0.00000 
0001: 0.000244141 
1000: 1.00000 
9000: -1.00000 
7fff: 7.99976 
+0

Ницца .. Спасибо !!! Это делает трюк – MoMan

1

Вы можете использовать

byte[] bytes = .... 
ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.????); // check your byte order 
while(bb.remaining() > 1) { 
    short s = bb.getShort(); 
    boolean signed = s < 0; 
    int value = s & 0x7FFF; 
    double d = s/4096.0; 
    if (signed) 
     d = -d; 
    System.out.println(d); 
} 
+1

Это позаботится о контенте. Спасибо, Питер! – MoMan