【问题标题】:Hex To Int In Python No Int ConstructorPython中的十六进制到Int没有Int构造函数
【发布时间】:2017-09-08 19:10:18
【问题描述】:

我试图在不使用 int 构造函数的情况下将表示十六进制数字的字符串转换为 python 中的 int。

例如,如果给我

    hexstring = "802"

我怎么会这样

    output = 2050

不做

    int("802",16)

我该怎么做?

【问题讨论】:

  • 你为什么需要避免int?
  • @chepner:常见的作业问题,有一个约束以防止琐碎的答案。
  • 你可以自己做int()的工作,即将“802”解析成(2 * 1) + (0 * 16) + (8 * 256)的组成部分。
  • for i in range(0,<big number>): if hex(i)[2:] == hexstring: return i -- 开个玩笑,别这样。
  • 一种方法是使用此列表的值:weird_numbers = [ord(x) for x in hexdigits],可能与ord('0') 和ord('a')(和/或ord('A'))的值有关...

标签: python string hex string-parsing


【解决方案1】:
hexstring = "802"
L=len(hexstring)

def val(h_char):
    # Note you need to extend this to make sure the lowercase hex digits are processed properly
    return ord(h_char)- (55 if ord(h_char)>64 else 48)

def sumup(sum,idx):
    global hexstring # global variables are not recommended
    L=len(hexstring)
    return sum + 16**idx*val(hexstring[L-idx-1])

output = reduce(lambda a,b:sumup(a,b),range(L),0))  


以下只是对上述内容的解释,不增加任何价值
由range(L) 生成的[0,1,2] 列表中的进程。

对于上面列表中的每个idx,函数调用为sumup(sum, idx)=sum+16^idx*h_digit_at_idx。(上面的^ is ** is exp)

h_digit_at_idx = ord(h_char)- (55 if ord(h_char)>64 else 48)

ord(h_char) 为十六进制字符生成48,49...57,65,66,67,68,69,70 0,1...10,A,B,C,D,E,F

ord(h_char)-(55 if ord(h_char)>64 else 48 为各个字符生成0,1...10,11,12,13,14,15。

最后reduce函数的最后一个参数是0(这是开始的初始总和)

【讨论】:

  • 很好,是的,我的解决方案使用了像 16*a + b 这样的“reducer”(在将字符串转换为 [0,16] 中的整数列表之后,使用了类似的 ord 技巧。跨度>
  • 如果小写字母作为十六进制数字输入,这也会产生不可靠的结果。我希望 OP 可以编辑该语句以添加小写十六进制数字的额外条件。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2013-02-01
相关资源
最近更新 更多