【问题标题】:How to convert a string into four numbers?如何将一个字符串转换为四个数字?
【发布时间】:2022-01-16 16:43:44
【问题描述】:

我想要一个可以转换成四个数字的字符串。

例如,它将字符串从 E17B1237 转换为 (225, 123, 18, 55),这是从十六进制转换为十进制。

E1 => 225,
7B => 123, 
12 => 18, 
37 => 55.

我该怎么做?十六进制转十进制只是一个例子,有什么办法吗?

如何区分一个字符串E17B1237,拆分成(225,123,18,55),然后进行转换。谢谢。

因为我想在坐标中有一个矩形,并且使用x,y,w,h来创建唯一ID,那么我也可以使用唯一ID来检索x,y,w,h。

如何创建一个唯一的 ID(来自 x,y,w,h),可以清楚地分成四个数字,然后进行转换。

【问题讨论】:

  • 在您的示例中,您将第一位从十六进制转换为十进制,但其余位从十进制转换为十六进制。您如何定义所需的输出应该是什么?四个部分中的第一个为十进制,其余为十六进制?
  • 对不起。我刚刚编辑了我的问题。只需从十六进制转换为十进制。谢谢。
  • 你想要做的事情是不是有点模棱两可?您的字符串中没有任何内容可以分隔数字。在您的示例中,您获取了 3,然后是 3,然后是 2,然后是 2 个数字 225 | 123 | 18 | 55。总是这种模式(3、3、2、2)吗?比如为什么不抓 3、3、3,然后是 1:225 | 123 | 185 | 5?是否总是应该先抓取前 3 个数字,然后是下一个 3,然后是下一个 2,最后是最后一个 2?
  • @leojail 仍然不太清楚您决定如何拆分/分区您的字符串。基本上,我想了解您如何决定要转换哪些数字?为什么是 18 你正在转换为十六进制而不是 185 例如?
  • 那么也许你应该看看SubtleCrypto.digest()

标签: javascript hex decimal


【解决方案1】:

假设字符串中的每个十六进制代码的长度为 2,您可以使用 .match(/[0-9A-F]{2}/ig) 将字符串分块成一个数组,以匹配两个字符的连续运行以获得以下数组:

['E1', '7B', '12', '37']

一旦你有了这个数组,你就可以在它上面使用.map() 来返回一个新的数组,你的数组中的每个十六进制代码元素都被转换成它等效的以 10 为底的值(十进制)。您可以在parseInt(string, radix) 的帮助下执行此操作,方法是将16(十六进制的基数)作为要转换的基数:

const hexStr = 'E17B1237';
const res = hexStr.match(/[0-9A-F]{2}/ig).map(hexPart => parseInt(hexPart, 16));
console.log(res);

【讨论】:

  • 非常感谢您的回答。但是十六进制代码字符串可能有3个长度,长度不规则。怎么做?谢谢。
  • @leojail 您能否分享不同的长度以及它们的外观和预期输出?
  • 坐标范围是10000 x 10000。例如Unique ID(hex)看起来像1901388C84B0,它对应(x,y,w,h)(十进制)将是(400,5000, 200、1200)。谢谢。
  • @leojail 在该示例中,输入的可能答案不止一个。您已经像 190 | 1388 | C8 | 4B0 那样拆分了您的字符串,然后将每个部分转换为十进制,例如,为什么不使用 1901 | 388 | C84 | B0 代替?这意味着您的输入字符串不明确,并且没有一种方法可以对其进行解码。您可以添加某种分隔符,例如逗号,您可以在上面拆分,例如:190,1388,C8,4B0?如果您想区分它们,您的编码十六进制字符串要么需要“固定长度”,要么以某种方式“无前缀”
  • 因为最后我会在智能合约中使用ID作为NFT的tokenID,ID spec应该是uint256。谢谢。
【解决方案2】:

你可以使用 toString paramters 来转换

function convert(value, from, to) {
  return parseInt(value, from).toString(to);
}

console.log(
  convert('e1', 16, 10),
  convert('123', 10, 16),
);

【讨论】:

猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2012-11-24
相关资源
最近更新 更多