取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
See how to use JMP Live to centralize and share reports within groups. Webinar with Q&A April 4, 2pm ET.
选择语言 隐藏翻译栏
查看原发布的话题

十六进制数不适用于 64 位

dadawasozo
Level IV

你好

我有十六进制数bea000000004080bh,我尝试了 hextonumber("bea000000004080bh"),但是不起作用。有人能帮我吗?

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

8 条回复8
Thierry_S
Super User

回复:十六进制数不适用于 64 位

你好,

你确定它是 64 位十六进制吗?包括“h”数字似乎不符合标准格式。

最好的,

TS

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

dadawasozo
Level IV

回复:十六进制数不适用于 64 位

抱歉,忘记删除末尾的 h 了。输出的原始数据末尾总是有一个 h 来表示十六进制值,我们在进行十六进制数字之前需要将其排除。

现在的问题是它与我们预期的数字不匹配。
JMP 将其转换为 -4.768372e-7

预期为-4710765210229274613

undefined

我错过了什么?

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

mzwald
Staff

回复:十六进制数不适用于 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 ));Lower32 = HexToNumber( Right( :hex64, 8 ), Base( 16 ));

请参阅附件的数据表示例。

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

dadawasozo
Level IV

回复:十六进制数不适用于 64 位

听起来 hextonumber() 需要改进,为什么它不能像计算器那样做同样的事情(参见第一篇文章中的图片)?

在处理数百万个数据点时,分解大 32 和小 32 效率不高。我必须处理数百个文件,每个文件包含超过 4000 万行十六进制值。分解 32 会耗费太多时间。

还有其他建议吗?

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

mzwald
Staff

回复:十六进制数不适用于 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

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

jthi
Super User

回复:十六进制数不适用于 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);

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

mzwald
Staff

回复:十六进制数不适用于 64 位

@jthi拆分值或将其存储为字符串是保留所有数字的唯一方法。由于 C++ 中 float64 变量的限制,JMP 中的任何数值都将限制为 17 位。显然,Python 具有无限的精度,因为数值不限于 64 位或 128 位,而是可以使用任意多的位来存储值,只要您有 RAM 来支持它。

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。

dadawasozo
Level IV

回复:十六进制数不适用于 64 位

是的,我们为此集成了 python。

感谢大家的意见。

这篇帖子最初是用 English (US) 书写的,已做计算机翻译处理。当您回复时,文字也会被翻译成 English (US)。