【问题标题】:Ruby: Converting Hexadecimal Strings to Hexadecimal NON-string (edited)Ruby:将十六进制字符串转换为十六进制非字符串(已编辑)
【发布时间】: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 fps600 rects 被绘制时)。当我在十六进制实际值(不是字符串数据类型)中硬编码时,该程序确实在60 fps 运行,所以我相信以这种格式使用这些值是可行的方法。这是我正在寻找的东西:

hex_int = hex_str.some_function_to_hex #--> 0xffffffff

任何想法将不胜感激。如果您可以分享一种可以将4294967295 直接转换为0xffffffff 的方法,那将是一个奖励!在此先感谢大家! :)

【问题讨论】:

  • 考虑到42949672950xffffffff 是相同的整数值,我真的不明白这个问题。 Ruby 仅显示以 10 为底的整数; #--&gt; 0xffffffff#--&gt; 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


【解决方案1】:

您可以直接将整数传递给Gosu::Color.new 以创建颜色

3.0.0 :002 > Gosu::Color.new(4294967295)
 => #<Gosu::Color:ARGB=0xff_ffffff>

Gosu::Color.argb

3.0.0 :003 > Gosu::Color.argb(4294967295)
 => #<Gosu::Color:ARGB=0xff_ffffff>

【讨论】:

  • 等等,这是否意味着我可以在这种情况下使用它? @image.draw(x, y, z_order, 1.0, 1.0, 4294967295, :additive) #replacing 0xffffffff or Gosu::Color
  • @TaylorMcDowell 是的,您也可以通过doc 确认。
  • 谢谢!这帮助了很多。
猜你喜欢
  • 2018-01-31
  • 1970-01-01
  • 2018-01-22
  • 2020-11-07
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多