十六进制数不适用于 64 位你好
我有十六进制数bea000000004080bh,我尝试了 hextonumber("bea000000004080bh"),但是不起作用。有人能帮我吗?
自动化和脚本回复:十六进制数不适用于 64 位你好,
你确定它是 64 位十六进制吗?包括“h”数字似乎不符合标准格式。
最好的,
TS
回复:十六进制数不适用于 64 位抱歉,忘记删除末尾的 h 了。输出的原始数据末尾总是有一个 h 来表示十六进制值,我们在进行十六进制数字之前需要将其排除。
现在的问题是它与我们预期的数字不匹配。
JMP 将其转换为 -4.768372e-7
预期为-4710765210229274613

我错过了什么?
回复:十六进制数不适用于 64 位您显示的值是有符号整数,而 HexToNumber() 返回无符号整数。
你还需要指定基数,例如
a = HexToNumber("bea000000004080b",Base(16));
为了解决有符号整数问题,可以使用如下公式:
max = HexToNumber("7fffffffffffffff",Base(16));
a = HexToNumber("bea000000004080b",Base(16));
if( a > max,
result = -(max+1) + (a-max);
, // else
result = a;
);
但是,您又会遇到另一个问题,即 JMP 无法精确呈现 64 位整数值。最后两位数字将被截断并具有随机值。我建议将您的 64 位值拆分为高 32 位值和低 32 位值,并将这些值存储在两个单独的列中。如下所示:
Upper32 = HexToNumber( Left( :hex64, 8 ), Base( 16 ));<BR />Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));
请参阅附件的数据表示例。
回复:十六进制数不适用于 64 位听起来 hextonumber() 需要改进,为什么它不能像计算器那样做同样的事情(参见第一篇文章中的图片)?
在处理数百万个数据点时,分解大 32 和小 32 效率不高。我必须处理数百个文件,每个文件包含超过 4000 万行十六进制值。分解 32 会耗费太多时间。
还有其他建议吗?
回复:十六进制数不适用于 64 位我会为此使用 python。好消息是 JMP18 可以直接在 JMP 中运行 python 脚本。这将是执行您想要的操作的 python 脚本:
import binascii
h = 'bea000000004080b'
b = bytes(h, 'utf-8')
ba = binascii.a2b_hex(b)
print(int.from_bytes(ba, byteorder='big', signed=True))
至于为什么 JMP 的精度限制为 17 位,那是因为 JMP 使用 float64 来表示数值。要获得超过 17 位的精度,JMP 需要使用 float128 来重新编译数值,从而导致其使用更多的系统内存。如果这很重要,您可以将其作为功能请求提交。您可以在此处执行此操作:https: //community.jmp.com/t5/JMP-Wish-List/idb-p/jmp-wish-list
回复:十六进制数不适用于 64 位@dadawasozo什么时间太多了(您有超过 40 000 000 * 100 行数据)?如果您必须快速转换这些数据,您可能需要发挥一点创造力(与此没有直接关系,但阅读“十亿行挑战”很有趣, https://github.com/gunnarmorling/1brc,您还可以从谷歌找到其他语言的解决方案,YouTube 上也有视频展示和解释一些解决方案)。
@mzwald当你回到 JMP 时,除了转换为字符串之外,还有其他方法可以避免出现“OverflowError: Python int too large to convert to C long”吗?拆分值?
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);
回复:十六进制数不适用于 64 位@jthi拆分值或将其存储为字符串是保留所有数字的唯一方法。由于 C++ 中 float64 变量的限制,JMP 中的任何数值都将限制为 17 位。显然,Python 具有无限的精度,因为数值不限于 64 位或 128 位,而是可以使用任意多的位来存储值,只要您有 RAM 来支持它。
回复:十六进制数不适用于 64 位是的,我们为此集成了 python。
感谢大家的意见。