代码之家  ›  专栏  ›  技术社区  ›  Matt

在Python中将十六进制字符串转换为int

  •  629
  • Matt  · 技术社区  · 17 年前

    我可以把它当作“ 0xffff “或者只是” ffff ".

    10 回复  |  直到 10 年前
        1
  •  1284
  •   Boris Verkhovskiy Brian Clapper    5 年前

    没有 对于0x前缀,您需要显式指定基,否则无法判断:

    x = int("deadbeef", 16)
    

    在0x前缀中,Python可以自动区分十六进制和十进制。

    >>> print(int("0xdeadbeef", 0))
    3735928559
    >>> print(int("10", 0))
    10
    

    (你 具体说明 0 作为基础,以调用此前缀猜测行为;如果省略第二个参数 int()

        2
  •  197
  •   Boris Verkhovskiy Brian Clapper    5 年前

    int(hexstring, 16) 执行此操作,并使用或不使用0x前缀:

    >>> int("a", 16)
    10
    >>> int("0xa", 16)
    10
    
        3
  •  52
  •   Community Mohan Dere    6 年前

    "0xffff" 或者只是 "ffff"

    int 以及要从中转换的基础。

    两个字符串都可以通过以下方式进行转换:

    >>> string_1 = "0xffff"
    >>> string_2 = "ffff"
    >>> int(string_1, 16)
    65535
    >>> int(string_2, 16)
    65535
    

    int 推断

    如果将0作为基数传递, int 将根据字符串中的前缀推断基数。

    >>> int(string_1, 0)
    65535
    

    没有十六进制前缀, 0x , int 没有足够的信息进行猜测:

    >>> int(string_2, 0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 0: 'ffff'
    

    文字:

    >>> integer = 0xffff
    >>> integer
    65535
    

    这对我不起作用 ffff 因为Python会认为您正在尝试编写一个合法的Python名称:

    >>> integer = ffff
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'ffff' is not defined
    

        4
  •  49
  •   Jorge Ferreira    17 年前

    对于任何给定字符串s:

    int(s, 16)
    
        5
  •  16
  •   Max    14 年前

    Dan在上面的回答中补充道:如果为int()函数提供一个十六进制字符串,则必须将基数指定为16,否则它不会认为您给了它一个有效值。对于字符串中不包含的十六进制数,不需要指定基数16。

    print int(0xdeadbeef) # valid
    
    myHex = "0xdeadbeef"
    print int(myHex) # invalid, raises ValueError
    print int(myHex , 16) # valid
    
        6
  •  9
  •   Community Mohan Dere    9 年前

    最糟糕的方式是:

    >>> def hex_to_int(x):
        return eval("0x" + x)
    
    >>> hex_to_int("c0ffee")
    12648430
    

    Is using eval in Python a bad practice?

        7
  •  6
  •   U13-Forward    7 年前

    ast.literal_eval (这是安全的,不像 eval

    ast.literal_eval("0xffff")
    

    演示:

    >>> import ast
    >>> ast.literal_eval("0xffff")
    65535
    >>> 
    
        8
  •  2
  •   maysara    7 年前

    如果您使用的是python解释器,只需键入0x(十六进制值),解释器就会自动为您转换它。

    >>> 0xffff
    
    65535
    
        9
  •  1
  •   Soundararajan    11 年前

    a = int('0x100', 16)
    print(a)   #256
    print('%x' % a) #100
    b = a
    print(b) #256
    c = '%x' % a
    print(c) #100
    
        10
  •  1
  •   shrewmouse    6 年前

    处理十六进制、八进制、二进制、整数和浮点

    使用标准前缀(即0x、0b、0和0o),此函数将把任何合适的字符串转换为数字。我在这里回答: https://stackoverflow.com/a/58997070/2464381 但这是所需的功能。

    def to_number(n):
        ''' Convert any number representation to a number 
        This covers: float, decimal, hex, and octal numbers.
        '''
    
        try:
            return int(str(n), 0)
        except:
            try:
                # python 3 doesn't accept "010" as a valid octal.  You must use the
                # '0o' prefix
                return int('0o' + n, 0)
            except:
                return float(n)
    
        11
  •  -2
  •   Nathan Tuggy TonyLuigiC    11 年前

    int('deadbeef',10) 似乎不起作用。

    以下是我的作品:

    >>a = int('deadbeef',16)
    >>float(a)
    3735928559.0
    
        12
  •  -3
  •   Junjie    14 年前

    使用“0x”前缀,还可以使用eval函数

    >>a='0xff'
    >>eval(a)
    255