hextonumber ne fonctionne pas avec 64 bitsSalut
J'ai un hexadécimal qui est bea000000004080bh, j'ai essayé hextonumber("bea000000004080bh"), mais ça ne marche pas. Quelqu'un peut-il m'aider ?
Automatisation et scriptsRe: hextonumber ne fonctionne pas avec 64 bitsSalut,
Etes-vous sûr qu'il s'agit d'un hexadécimal 64 bits ? L'inclusion du chiffre « h » ne semble pas conforme au format standard.
Meilleur,
TS
Re: hextonumber ne fonctionne pas avec 64 bitsdésolé, j'ai oublié de supprimer le h à la fin. la sortie brute a toujours h à la fin pour indiquer la valeur hexadécimale que nous devons exclure avant de faire hextonumber.
Maintenant, le problème est que cela ne correspond pas au nombre auquel nous nous attendions.
JMP l'a converti en -4.768372e-7
attendu est -4710765210229274613

Qu'est-ce qui me manque ?
Re: hextonumber ne fonctionne pas avec 64 bitsLa valeur que vous affichez est un entier signé et HexToNumber() renvoie un entier non signé.
Vous devez également spécifier la base, quelque chose comme
a = HexToNumber("bea000000004080b",Base(16));
Pour contourner le problème des entiers signés, vous pouvez utiliser une formule comme celle-ci :
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
Mais vous rencontrez alors un autre problème : JMP ne peut pas restituer avec précision une valeur entière de 64 bits. Les deux derniers chiffres seront tronqués et auront des valeurs aléatoires. Je vous recommande de diviser votre valeur de 64 bits en une valeur supérieure de 32 bits et une valeur inférieure de 32 bits, et de stocker ces valeurs dans deux colonnes distinctes. Quelque chose comme ça :
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
Reportez-vous à l’exemple de tableau de données ci-joint.
Re: hextonumber ne fonctionne pas avec 64 bitsil semble qu'une amélioration soit nécessaire pour hextonumber(), pourquoi ne peut-il pas faire la même chose que la calculatrice (voir l'image dans le tout premier message) ?
décomposer les 32 supérieurs et inférieurs n'est pas efficace lorsqu'il s'agit de traiter des millions de points de données. Je dois traiter des centaines de fichiers contenant chacun plus de 40 millions de lignes de valeur hexadécimale. Faire la décomposition de 32 prendrait trop de temps.
une autre suggestion ?
Re: hextonumber ne fonctionne pas avec 64 bitsJ'utiliserais Python pour cela. La bonne nouvelle est que JMP18 peut exécuter des scripts Python directement dans JMP. Ce serait le script Python qui ferait ce que vous voulez :
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
Quant à la raison pour laquelle JMP est limité à 17 chiffres de précision, c'est parce que JMP utilise float64 pour les valeurs numériques. Pour obtenir plus de 17 chiffres, JMP devrait être recompilé en utilisant float128 pour les valeurs numériques, ce qui l'obligerait à utiliser plus de mémoire système. Si cela est important, vous pouvez le soumettre sous forme de demande de fonctionnalité. Vous pouvez le faire ici : https://community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
Re: hextonumber ne fonctionne pas avec 64 bits@dadawasozo qu'est-ce que c'est que trop de temps (vous avez plus de 40 000 000 * 100 lignes de données) ? Si vous devez convertir ces données rapidement, vous devrez peut-être faire preuve d'un peu de créativité (ce n'est pas directement lié à cela, mais il est intéressant de lire sur "The One Billion Row Challenge", https://github.com/gunnarmorling/1brc, vous pouvez également trouver des solutions pour d'autres langues sur Google et il existe également des vidéos sur YouTube qui montrent et expliquent certaines solutions).
@mzwald Lorsque vous revenez à JMP, existe-t-il un moyen d'éviter « OverflowError : Python int too large to convert to C long » en dehors de la conversion en chaîne ? En divisant la valeur ?
Names Default To Here(1);
hex_to_signed_int_str = function({h},
Python Execute({h}, {x},
"\[import binascii
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
x = int.from_bytes(ba, byteorder='big', signed=True)
#x = str(x)
]\");
return(x);
);
signed_int_str = hex_to_signed_int_str("bea000000004080b");
show(signed_int_str);
Re: hextonumber ne fonctionne pas avec 64 bits@jthi diviser la valeur ou la stocker sous forme de chaîne serait le seul moyen de conserver tous les chiffres. Toute valeur numérique dans JMP sera limitée à 17 chiffres en raison des limitations des variables float64 en C++. Apparemment, Python a une précision illimitée dans le sens où les valeurs numériques ne sont pas limitées à 64 bits ou 128 bits, mais peuvent utiliser autant de bits que nécessaire pour stocker la valeur tant que vous disposez de la RAM pour la prendre en charge.
Re: hextonumber ne fonctionne pas avec 64 bitsoui, nous intégrons python pour cela.
Merci à tous pour vos contributions.