gpt4 book ai didi

ruby - 用等效的十六进制替换字符串中的十进制数字

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:26 26 4
gpt4 key购买 nike

我有一大堆字符串,比如:

// Register 10:
typedef struct RegAddr_10
{
uint8 something: 4;
uint8 something_else: 4;
} tRegAddr_10;

并希望将所有寄存器地址(以十进制数给出)转换为十六进制。每个 typedef 中可以出现其他数字;因此我必须将 Reg 部分视为一种分隔符。该示例应导致:

// Register 0x0A:
typedef struct RegAddr_0x0A
{
uint8 something: 4;
uint8 something_else: 4;
} tRegAddr_0x0A;

我的解决方案是这样的:

class String
def convert_base(from, to)
self.to_i(from).to_s(to)
end
end

new = text.gsub(/Reg\D*\d*/) do |number|
number.gsub(/(\d+)/) {'0x'+$1.convert_base(10,16)}
end

它有效,但是:

  1. (如何)仅用一个 gsub 就可以做到这一点?
  2. 如何使转换生成大写的 2 位十六进制数字,例如100x0A,不是0xa

最佳答案

代码

R = /
(?: # begin non-capture group
^ # match beginning of line
\/{2}\s+Register\s+ # match string
| # or
\s+RegAddr_ # match string
| # or
\s+tRegAddr_ # match string
) # close non-capture group
\K # discard everything matched so far
\d+ # match >= 1 digits
/x # extended mode

def replace_with_hex(str)
str.gsub(R) { |s| "0x%02X" % s }
end

String#% 的格式字符串部分百分号后面的是:0,表示用零填充,2 表示字段宽度,X 表示用字母 转换为十六进制>A-F 大写(x 为小写)。

示例

str = <<_ 
// Register 10:
typedef struct RegAddr_10
{
uint8 something: 4;
uint8 something_else: 4;
} tRegAddr_10;
_

puts replace_with_hex(str)

打印:

// Register 0x0A:
typedef struct RegAddr_0x0A
{
uint8 something: 4;
uint8 something_else: 4;
} tRegAddr_0x0A;

备选方案

如果你不那么挑剔:

R = /
[\s|t] # match whitespace or t
Reg\D+ # match string
\K # discard everything matched so far
\d+ # match >= 1 digits
/x # extended mode

同样有效。

您还可以将 replace_with_hex 的操作行更改为:

str.gsub(R, "0x%02X" % $~[0])

关于ruby - 用等效的十六进制替换字符串中的十进制数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32847232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com