hextonumber no funciona con 64 bitsHola
Tengo un hexadecimal que es bea000000004080bh, probé hextonumber("bea000000004080bh"), pero no funciona. ¿Alguien me puede ayudar?
Automatización y scriptingRe: hextonumber no funciona con 64 bitsHola,
¿Está seguro de que se trata de un sistema hexadecimal de 64 bits? Incluir el dígito "h" no parece ajustarse al formato estándar.
Mejor,
TS
Re: hextonumber no funciona con 64 bitsLo siento, olvidé quitar la h al final. El formato de salida siempre tiene h al final para indicar el valor hexadecimal que debemos excluir antes de realizar hextonumber.
Ahora el problema es que no coincide con el número que esperábamos.
JMP lo convirtió como -4.768372e-7
Se espera -4710765210229274613

¿Que me estoy perdiendo?
Re: hextonumber no funciona con 64 bitsEl valor que muestra es un entero con signo y HexToNumber() devuelve un entero sin signo.
También es necesario especificar la base, algo así como
a = HexToNumber("bea000000004080b",Base(16));
Para solucionar el problema del número entero con signo, puedes utilizar una fórmula como esta:
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
Pero luego te encuentras con otro problema: JMP no puede representar un valor entero de 64 bits con precisión. Los dos últimos dígitos se truncarán y tendrán valores aleatorios. Recomendaría dividir el valor de 64 bits en un valor superior de 32 bits y un valor inferior de 32 bits, y almacenar esos valores en dos columnas separadas. Algo como esto:
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
Consulte el ejemplo de tabla de datos adjunta.
Re: hextonumber no funciona con 64 bitsParece que se necesita una mejora para hextonumber(). ¿Por qué no puede hacer lo mismo que la calculadora (ver imagen en la primera publicación)?
Desglosar los 32 números superiores e inferiores no es eficiente cuando se trabaja con millones de puntos de datos. Tengo que procesar cientos de archivos que contienen cada uno más de 40 millones de filas de valores hexadecimales. Desglosar los 32 números consumiría demasiado tiempo.
¿Alguna otra sugerencia?
Re: hextonumber no funciona con 64 bitsYo usaría Python para esto. La buena noticia es que JMP18 puede ejecutar scripts de Python directamente en JMP. Este sería el script de Python para hacer lo que quieres:
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
En cuanto a por qué JMP está limitado a 17 dígitos de precisión, es porque JMP usa float64 para valores numéricos. Para obtener más de 17 dígitos, JMP necesitaría ser recompilado usando float128 para valores numéricos, lo que haría que use más memoria del sistema. Si esto es importante, puede enviarlo como una solicitud de función. Puede hacerlo aquí: https://community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
Re: hextonumber no funciona con 64 bits@dadawasozo ¿qué es demasiado tiempo (tienes más de 40 000 000 * 100 filas de datos)? Si tienes que convertir esos datos rápidamente, es posible que tengas que ser un poco creativo (no está directamente relacionado con esto, pero es interesante leer sobre "El desafío de los mil millones de filas", https://github.com/gunnarmorling/1brc, también puedes encontrar soluciones para otros idiomas en Google y también hay videos en YouTube que muestran y explican algunas soluciones).
@mzwald Cuando vuelvas a JMP, ¿hay alguna manera de evitar el error "OverflowError: Python int too large to convert to C long" además de convertirlo en una cadena? ¿Dividiendo el valor?
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 no funciona con 64 bits@jthi dividir el valor o almacenarlo como una cadena sería la única forma de conservar todos los dígitos. Cualquier valor numérico en JMP estará limitado a 17 dígitos debido a las limitaciones de las variables float64 en C++. Aparentemente, Python tiene una precisión ilimitada en el sentido de que los valores numéricos no están limitados a 64 bits o 128 bits, sino que pueden usar tantos bits como sean necesarios para almacenar el valor siempre que tenga la RAM para soportarlo.
Re: hextonumber no funciona con 64 bitsSí, integramos Python para eso.
Gracias a todos por sus aportaciones.