Come convertire un byte specificato in un file binario in un numero in virgola mobile?Ad esempio, converti i byte 04-07 nella prima riga della figura in numeri a virgola mobile, grazie esperti!

Il risultato corretto è: 1006.27
Il file binario è il seguente:
598A0F0548917B44F6C87B44855B7B44D7637B44DA57BE45140B000000000000
Scriptingfinestre:excel VBA

Risposta: come convertire i byte specificati nel file binario in numeri a virgola mobile?Questa funzione non può essere implementata
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
Esiste una funzione simile, Matrix To Blob, per convertire l'altra direzione.
I float a 4 byte hanno 6 o 7 cifre significative. I float a 8 byte hanno 15 o 16 cifre significative.
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
Se provi a utilizzare il calcolatore esadecimale di Windows, che ha un comodo display a bit, assicurati di invertire i byte.
48917B44 -> 447B9148 -> 0 10001000 11110111001000101001000 -> 2^(136-127) * (1+1/2+1/4+1/8+1/16+0/32+1/64 +...)
Re: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Grazie esperti!
In questo file binario
00, 01 byte-anno, mese e giorno
02, 03 byte-divisione del tempo

Vuoi aumentare la segmentazione nel codice? Grazie ancora!
numbers = Blob To Matrix( blobdata, "float", 4, "little" );
Re:È possibile elaborare questi quattro byte come quattro uint da 1 byte o come due uint da 2 byte. Uint significa intero senza segno. Invece di float, usa uint. Dovrai capire come rappresentano il tempo, non è ovvio con un solo esempio non decodificato.
Re: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Ho ancora la possibilità di eseguire questa operazione.
Ho caricato l'intero file, ha 5070 righe di dati come questo.
Vedi come codificare?
Grazie!
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:Potresti fare un grafico dei dati come questo. Sembra che ci siano alcuni outlier!
dati estratti dal file zip e rappresentati graficamente per vedere i valori anomali.
/*
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: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Grazie mille per l'aiuto degli esperti!
JMP è troppo potente!
JMP può essere usato in questo modo!
so troppo poco.
Grazie ancora agli esperti!
Re: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Devo ancora continuare a chiedere agli esperti:
Come modificare il codice se da questo file vengono estratte solo le ultime 480 righe di dati come questo?
Grazie esperti!
Tali dati sono 5070 righe nel file originale. E la fine del file binario originale è altro testo, non dati.
Re: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Ho provato a modificarlo in questo modo, ma senza successo.
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:c'era un messaggio nel registro?
tutti questi array (anni,mesi,giorni,secondi) avranno bisogno dello stesso trattamento: anni[r-479::r], per esempio.
Potrebbe essere più semplice eliminare le righe indesiderate dalla tabella dopo averla creata. Prova a utilizzare la colonna della data per selezionare l'intervallo che ti interessa.
Re: Come convertire i byte specificati nel file binario in numeri a virgola mobile?Vedendo questo grafico, sollevo due dubbi:
1. Affinché la grafica sia continua e non influenzata dall'intervallo di date, esiste un modo semplice per ottenerlo. Userò solo la colonna del numero di riga come asse 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. In realtà i dati di trading di questo stock di dati.
JMP può realizzare direttamente candelieri giapponesi come questo? Questo tipo di grafico può essere facilmente prodotto in excel

grazie mille!