¿Cómo convertir un byte especificado en un archivo binario en un número de punto flotante?Por ejemplo, convierta los bytes 04-07 en la primera fila de la figura en números de punto flotante, ¡gracias expertos!

El resultado correcto es: 1006,27
El archivo binario es el siguiente:
598A0F0548917B44F6C87B44855B7B44D7637B44DA57BE45140B000000000000
ScriptingVentanas回复 : 怎样 将 二进制 文件 中 的 指定 字节 转化 为 浮点 数字?excel VBA

Respuesta: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?Esta función no se puede implementar
CopyMemory v, b(0), 4
Re: 怎样 将 二进制 文件 中 的 指定 字节 转化 为 浮点 数字?
filename = Save Text File(
"$temp/deleteme.bin",
Hex To Blob( "598A0F0548917B44F6C87B44855B7B44D7637B44DA57BE45140B000000000000" )
);
// load the entire file. You could use the blob() parameter
// to load a smaller part of the file by offset and length.
blobdata = Load Text File( filename, blob() );
// convert the binary data to a matrix. The 4 means 4 byte chunks
// and "little" means the least significant byte comes first (little endian.)
numbers = Blob To Matrix( blobdata, "float", 4, "little" );
// print the values; JMP uses 8-byte floating point and will
// display more resolution than is actually available.
For( i = 1, i <= N Rows( numbers ), i += 1,
Write( "\!n", i, " ", numbers[i] )
);
1 6.74923813801151e-36
2 1006.27001953125
3 1007.14001464844
4 1005.42999267578
5 1005.55999755859
6 6090.9814453125
7 3.97408244482518e-42
8 0
Existe una función similar, Matrix To Blob, para convertir la otra dirección.
Los flotantes de 4 bytes tienen 6 o 7 dígitos significativos. Los flotantes de 8 bytes tienen 15 o 16 dígitos significativos.
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
Si intenta utilizar la calculadora hexadecimal de Windows, que tiene una pantalla de bits conveniente, asegúrese de invertir los bytes.
48917B44 -> 447B9148 -> 0 10001000 11110111001000101001000 -> 2 ^ (136-127) * (1 + 1/2 + 1/4 + 1/8 + 1/16 + 0/32 + 1/64 + ...)
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?¡Gracias expertos!
En este archivo binario
00, 01 bytes-año, mes y día
02, 03 bytes-división de tiempo

¿Quieres incrementar la segmentación en el código? ¡Gracias de nuevo!
numbers = Blob To Matrix( blobdata, "float", 4, "little" );
Re: 怎样 将 二进制 文件 中 的 指定 字节 转化 为 浮点 数字?Puede procesar esos cuatro bytes como cuatro uint de 1 byte o dos uint de 2 bytes. Uint significa entero sin signo. En lugar de flotar, use uint. Tendrá que averiguar cómo representan la hora, no es obvio con un solo ejemplo que no está decodificado.
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?Todavía tengo la capacidad para realizar esta operación.
Subí el archivo completo, tiene 5070 filas de datos como este.
¿Ves cómo codificar?
¡Gracias!
00 to 01 bytes: indicates the date. If the value is num, the date calculation method is as follows:
year=floor(num/2048)+2004;
month=floor(mod(num,2048)/100);
day=mod(mod(num,2048),100);
02 to 03 bytes: indicates the number of minutes from 0 o 'clock to the present
04 to 07 bytes: float
08 to 11 bytes: float
12 to 15 bytes: float
16 to 19 bytes: float
20 to 23 bytes: float
24 to 27 bytes: integer
28 to 31 bytes :(reserved)
Re: 怎样 将 二进制 文件 中 的 指定 字节 转化 为 浮点 数字?Podrías hacer un gráfico de los datos como este. ¡Parece que hay algunos valores atípicos!
datos extraídos del archivo zip y graficados para ver valores atípicos.
/*
00 to 01 bytes: indicates the date. If the value is num, the date calculation method is as follows:
year=floor(num/2048)+2004;
month=floor(mod(num,2048)/100);
day=mod(mod(num,2048),100);
02 to 03 bytes: indicates the number of minutes from 0 o 'clock to the present
04 to 07 bytes: float
08 to 11 bytes: float
12 to 15 bytes: float
16 to 19 bytes: float
20 to 23 bytes: float
24 to 27 bytes: integer
28 to 31 bytes :(reserved)
*/
za = Open( "z:/445.zip", "zip" ); // open the zip file
datasetname = (za << dir)[1];
blobdata = za << read( datasetname, Format( blob ) ); // load the member as a blob
//
// the following 3 lines import ALL of the data each time. Later,
// only use the columns that were really in that format.
//
integer2 = Blob To Matrix( blobdata, "uint", 2, "little", 16 ); // get the 2-byte unsigned ints for columns 0-1 and 2-3
integer4 = Blob To Matrix( blobdata, "uint", 4, "little", 8 ); // get the 4-byte unsigned ints for columns 24-27 and 28-31
float4 = Blob To Matrix( blobdata, "float", 4, "little", 8 ); // get the 4-byte floats for columns 4-23
// pre-process the matrix columns; no explicit loop is required...
years = Floor( integer2[0, 1] / 2048 ) + 2004;
months = Floor( Mod( integer2[0, 1], 2048 ) / 100 );
days = Mod( Mod( integer2[0, 1], 2048 ), 100 );
seconds = 60 * integer2[0, 2];
// create a table. You could also use new table, but the v1...v5 would be a little more code to type
dt = As Table(
years,
months,
days,
seconds,
float4[0, 2 :: 6],
integer4[0, 7 :: 8],
<<COLUMNNAMES></COLUMNNAMES>
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?¡Muchas gracias por la ayuda de los expertos!
¡JMP es demasiado poderoso!
¡JMP se puede usar así!
Sé muy poco.
¡Gracias de nuevo a los expertos!
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?Todavía tengo que seguir preguntando a los expertos:
¿Cómo modificar el código si solo se extraen de este archivo las últimas 480 líneas de datos como este?
¡Gracias expertos!
Dichos datos son 5070 líneas en el archivo original. Y el final del archivo binario original es otro texto, no datos.
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?Intenté modificarlo así, pero no tuve éxito.
r = N Row( years );
dt = As Table(
years,
months,
days,
seconds,
float4[r - 479 :: r, 2 :: 6], ////
integer4[r - 479 :: r, 7 :: 8], ///
<<COLUMNNAMES></COLUMNNAMES>
Re: 怎样 将 二进制 文件 中 的 指定 字节 转化 为 浮点 数字?¿Había un mensaje en el registro?
todas esas matrices (años, meses, días, segundos) necesitarán el mismo tratamiento: años [r-479 :: r], por ejemplo.
Puede ser más fácil eliminar filas no deseadas de la tabla después de crearla. Intente usar la columna de la fecha para seleccionar el rango que le interesa.
Re: ¿Cómo convertir los bytes especificados en el archivo binario en números de punto flotante?Al ver este gráfico, planteo dos dudas:
1. Para que los gráficos sean continuos y no se vean afectados por el intervalo de fechas, ¿hay alguna forma sencilla de lograrlo? Solo usaré la columna de número de fila como eje X
Column( "reserved" ) << Formula( Row() );dt << run formulas;Column( "reserved" ) << deleteFormula;
……
Variables( X( :reserved ), Y( :v5 ), Y( :v4 ), Y( :v3 ), Y( :v2 ), Y( :v1 ), Y( :xx ) ),

2. En realidad, los datos comerciales de este stock de datos.
¿Puede JMP fabricar directamente candelabros japoneses como este? Este tipo de gráfico se puede producir fácilmente en Excel.

¡Muchas gracias!