Estoy tratando de decodificar este blob de Firebird para extraer números decimales de él (no estoy seguro exactamente en qué formato estarán). Algo de contexto es que la mancha está almacenando datos del espectro de vibraciones que grafican la amplitud contra la frecuencia. Sin embargo, estoy bastante seguro de que el blob solo contiene los datos de amplitud. Aquí hay un ejemplo de exportación de blobs para un pequeño espectro de prueba que generé:

0000803F0000004000004040000080400000A0400000C0400000E0400000004100001041000020410000304100004041000050410000604100007041000080410000884100009041000098410000A0410000A8410000B0410000B8410000C0410000C8410000D0410000D8410000E0410000E8410000F0410000F84100000042000004420000084200000C4200001042000014420000184200001C4200002042000000006666663FA4707D3F77BE7F3F72F97F3F58FF7F3F0000803F0000C03F0000004000002040000040400000604000008040000088400000904000009840CDCC9C400000A0400000C84200007A4400401C46

Por lo que puedo decir, parece que cada número está representado por 4 bytes de datos que son hexadecimales en esta exportación. Sé que son 4 bytes por valor debido a cómo se alinea con mi conjunto de prueba a continuación. También creo que potencialmente los primeros 2 bytes son la parte fraccionaria y los últimos 2 son los números enteros. Creo que también podría usar un factor de escala. Aquí está mi conjunto de prueba (igual que el anterior, recién reformateado), con los valores reales (amplitudes):

Actual Value    Blob Section
1   0000803F
2   00000040
3   00004040
4   00008040
5   0000A040
6   0000C040
7   0000E040
8   00000041
9   00001041
10  00002041
11  00003041
12  00004041
13  00005041
14  00006041
15  00007041
16  00008041
17  00008841
18  00009041
19  00009841
20  0000A041
21  0000A841
22  0000B041
23  0000B841
24  0000C041
25  0000C841
26  0000D041
27  0000D841
28  0000E041
29  0000E841
30  0000F041
31  0000F841
32  00000042
33  00000442
34  00000842
35  00000C42
36  00001042
37  00001442
38  00001842
39  00001C42
40  00002042
0   00000000
0.9 6666663F
0.99    A4707D3F
0.999   77BE7F3F
0.9999  72F97F3F
0.99999 58FF7F3F
1   0000803F
1.5 0000C03F
2   00000040
2.5 00002040
3   00004040
3.5 00006040
4   00008040
4.25    00008840
4.5 00009040
4.75    00009840
4.9 CDCC9C40
5   0000A040
100 0000C842
1000    00007A44
10000   00401C46

Es bastante obvio que no es solo una conversión hexadecimal - decimal directa, pero siento que esto es algo que un experto podría reconocer. ¡Cualquier ayuda o sugerencia sobre cómo decodificar estos 4 bytes de hexadecimal de nuevo a un valor numérico sería muy apreciada!

1
Rory LM 18 nov. 2019 a las 07:48

1 respuesta

La mejor respuesta

Ese es el formato de punto flotante de 4 bytes estándar de la industria (flotador único).

Por supuesto, el orden de los bytes también debe tenerse en cuenta (lo ve visualmente invertido en su volcado anterior, en comparación con la escritura normal de números enteros hexadecimales en el sitio anterior).

3
Arioch 'The 18 nov. 2019 a las 09:35