【发布时间】:2021-12-26 08:07:53
【问题描述】:
最近,我一直在网上搜索将十六进制字符串转换为十六进制实际值的方法。例如,"0xffffffff" -> 0xffffffff。加载 JSON 文件(无法直接存储十六进制)后,使用以下示例代码将存储的整数值 4294967295 成功转换回 "0xffffffff":
hex_str = "0x" << 4294967295.to_s(16) #--> "0xffffffff"
真正令人沮丧的是,如果不是 String 数据类型,我似乎无法找到一种 Ruby 方法来重新创建该十六进制值...我真的希望我没有忽略任何东西。我使用非字符串十六进制的原因是将它们用于 Gosu 着色符号。我不想使用 Gosu 的 Color 类(输入 rgb 值 [255, 255, 255]),因为当游戏中生成许多矩形 quad_draw() 对象时,它会大大降低性能(它从 60 fps 下降到大约 42 fps当600 rects 被绘制时)。当我在十六进制实际值(不是字符串数据类型)中硬编码时,该程序确实在60 fps 运行,所以我相信以这种格式使用这些值是可行的方法。这是我正在寻找的东西:
hex_int = hex_str.some_function_to_hex #--> 0xffffffff
任何想法将不胜感激。如果您可以分享一种可以将4294967295 直接转换为0xffffffff 的方法,那将是一个奖励!在此先感谢大家! :)
【问题讨论】:
-
考虑到
4294967295和0xffffffff是相同的整数值,我真的不明白这个问题。 Ruby 仅显示以 10 为底的整数;#--> 0xffffffff与#--> 4294967295没有什么不同。 -
您的问题不清楚。没有“十六进制整数”或“十进制整数”或“二进制整数”或“三进制整数”或任何其他基本整数之类的东西。整数是整数。时期。基数是 notation 的属性,而不是数字。换句话说,术语“十六进制整数”是没有意义的。它甚至没有错,它根本没有意义。您可以有一个整数的十六进制表示,但这纯粹是文本表示的一个属性。在 Ruby 中,文本的数据类型是
String,因此“十六进制”only 对字符串有意义。 -
Gosu 还使用
_将 alpha 值与 RGB 值分开,例如0xff_ffffff。就像十六进制符号一样,_纯粹是装饰性的。请参阅number literals 的文档。 -
@JörgWMittag 谢谢你的解释——你说的很有道理。我不确定为什么我会被否决,但如果你说十六进制只能作为字符串,那么为什么 Ruby 允许我写出
0xffffffff不带引号,就好像它是一个整数(或其他一些数据类型)?我知道 4294967295 与 0xffffffff 相同,但为什么非字符串 0xffffffff 是一个东西?当我尝试使用“0xffffffff”作为字符串时,它确实有所不同 - Gosu::Color.new("0xffffffff") 不起作用,但 Gosu::Color.new(0xffffffff) 可以。你能解释一下吗? -
@CarySwoveland 很高兴知道这一点。谢谢!
标签: ruby string integer hex libgosu