Comment convertir un octet spécifié dans un fichier binaire en un nombre à virgule flottante ?Par exemple, convertissez les octets 04-07 de la première ligne de la figure en nombres à virgule flottante, merci les experts !

Le résultat correct est : 1006.27
Le fichier binaire est le suivant :
598A0F0548917B44F6C87B44855B7B44D7637B44DA57BE45140B000000000000
Scriptles fenêtres怎样将二进制文件中的指定字节转化为浮点数字?excel VBA

Réponse : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?Cette fonction ne peut pas être implémentée
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
Il existe une fonction similaire, Matrix To Blob, pour convertir l'autre sens.
Les flottants de 4 octets ont 6 ou 7 chiffres significatifs. Les flottants de 8 octets ont 15 ou 16 chiffres significatifs.
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
Si vous essayez d'utiliser la calculatrice hexadécimale Windows, qui a un affichage de bits pratique, assurez-vous d'inverser les octets.
48917B44 -> 447B9148 -> 0 10001000 11110111001000101001000 -> 2^(136-127) * (1+1/2+1/4+1/8+1/16+0/32+1/64 +...)
Re : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?Merci les connaisseurs !
Dans ce fichier binaire
00, 01 octets-année, mois et jour
02, 03 division octets-temps

Voulez-vous augmenter la segmentation dans le code ? Merci encore!
numbers = Blob To Matrix( blobdata, "float", 4, "little" );
Re :Vous pouvez traiter ces quatre octets comme quatre uint à 1 octet ou deux uint à 2 octets. Uint signifie entier non signé. Au lieu de float, utilisez uint. Il va falloir trouver comment ils représentent le temps, ce n'est pas évident avec un seul exemple qui n'est pas décodé.
Re : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?J'ai encore la possibilité d'effectuer cette opération.
J'ai téléchargé l'intégralité du fichier, il contient 5070 lignes de données comme celle-ci.
Voir comment encoder?
Merci!
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 :Vous pourriez faire un graphique des données comme ceci. On dirait qu'il y a des valeurs aberrantes !
données extraites du fichier zip et représentées graphiquement pour voir les valeurs aberrantes.
/*
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 : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?Merci beaucoup pour l'aide des experts !
JMP est trop puissant !
JMP peut être utilisé comme ça !
Je sais trop peu.
Merci encore aux connaisseurs !
Re : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?Je dois encore continuer à demander aux experts:
Comment modifier le code si seules les 480 dernières lignes de données comme celle-ci sont extraites de ce fichier ?
Merci les connaisseurs !
Ces données représentent 5070 lignes dans le fichier d'origine. Et la fin du fichier binaire d'origine est un autre texte, pas des données.
Re : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?J'ai essayé de le modifier comme ça, mais sans succès.
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 :y avait-il un message dans le journal ?
tous ces tableaux (années, mois, jours, secondes) auront besoin du même traitement : années[r-479::r], par exemple.
Il peut être plus facile de supprimer les lignes indésirables de la table après l'avoir créée. Essayez d'utiliser la colonne de date pour sélectionner la plage qui vous intéresse.
Re : Comment convertir les octets spécifiés dans le fichier binaire en nombres à virgule flottante ?En voyant ce graphique, je soulève deux doutes :
1. Pour que les graphiques soient continus et ne soient pas affectés par l'intervalle de date, existe-t-il un moyen simple d'y parvenir. Je n'utiliserai que la colonne du numéro de ligne comme axe 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 fait, les données de trading de ce stock de données.
JMP peut-il fabriquer directement des chandeliers japonais comme celui-ci ? Ce type de graphique peut être facilement produit dans excel

Merci beaucoup!