如何将整数列表连接到一个整数python

时间:2018-08-24 11:28:20

标签: python list join integer byte

给定一个十六进制整数列表,我想以一个十六进制整数结尾,在该十六进制整数中,整数被视为最高有效的最后一个和最低有效的最后一个。

例如,给定... [0x1A,0xF3、0x74、0xA3]

...我想结束 0x1AF374A3

在我熟悉的另一种编程语言中,这是一个相当简单的操作,称为“ join”,但是显然“ join”在Python中意味着其他含义。

我知道我可以遍历列表,将每个后续元素乘以2 ^并相加。我也知道我可以将元素转换为字符串,将它们连接起来,然后再转换回整数。但是这两种方法都显得笨拙。似乎应该有一个更简单/更优雅的方式。有吗?

在此先感谢您的帮助!

7 个答案:

答案 0 :(得分:5)

我建议您将值切换为 bytes 类型以进行连接,将它们切换回 int 类型,如下所示:

myList = [0x1A, 0xF3, 0x74, 0xA3]
# Conversion to 'bytes'
a = bytes()
for b in myList:
    a += b.to_bytes(1,'big')
# Conversion back to 'int'
a = int.from_bytes(a, 'big')
print(hex(a))  # 0x1af374a3

并且您可以用生成器理解替换经典的for循环,该生成器作为参数传递给join()方法,以便连接字节项。它仍然可读,并且简短一些,如下所示:

myList = [0x1A, 0xF3, 0x74, 0xA3]
a = b''.join(b.to_bytes(1,'big') for b in myList) # Conversion to 'bytes'
a = int.from_bytes(a, 'big')                      # Conversion back to 'int'
print(hex(a))  # 0x1af374a3

请注意,如果输入列表中的整数超过255,则由于OverflowError: int too big to convert,您将在逻辑上收到错误b.to_bytes(1,'big')。当然,如果发生这种情况,可以通过管理异常来改进。

我最后可能还会建议您使用256的幂乘积的解决方案,只是向您展示它只能用一行实现:

myList = [0x1A, 0xF3, 0x74, 0xA3]
a = sum(nb*(256**i) for i,nb in enumerate(reversed(myList)))
print(hex(a))  # 0x1af374a3

答案 1 :(得分:1)

l = [0x1A, 0xF3, 0x74, 0xA3]

merged = ''.join([str(hex(el))[2:] for el in l])

如果您需要十六进制,则可以通过以下方式获得它:

hex(int(merged, 16)) --> 0x1af374a3

答案 2 :(得分:1)

在下面的代码中,没有什么效率极低或难看的东西,尽管乍看之下似乎没有。如果需要更高的速度,则必须使用按位运算符将所有int合并在一起。

 <?php

//abstract class that defines what it takes to be a duck
//inside Duck we will have $flyBehavoir object of FlyBehavoir Type 
abstract class Duck{
    private  $flyBehavoir; 

    public function preformFly(){
        $flyBehavoir.fly();
    }
    public function setFlyBehavoir(FlyBehavoir $flyBehavoir){
        $this->flyBehavoir =  $flyBehavoir;
    }
}

//creating type FlyBehavoir 
interface FlyBehavoir{
    function fly();
}

//this concrete class of type FlyBehavoir  this will provide our ducks with the functionality they need to fly
class FlyWithWings implements FlyBehavoir{
    public function fly(){
        echo "I am Flying with my own Wings<br>";
    }
}

//this concrete class of type FlyBehavoir  this will provide our ducks with the functionality they need to fly
class FlyWithRocket implements FlyBehavoir{
    public function fly(){
        echo "I am the fastest duck ever, see my rockets wings <br>";
    }
}


// creating our first duck and given it the ability to fly with wings
class DonaldDuck extends Duck{

    public function __construct(){
        $this->flyBehavoir =  new FlyWithWings;
    }

}


$donaldDuck = new DonaldDuck( ) ;

$donaldDuck->flyBehavoir->fly();
//changing behavoir in run time 
$donaldDuck->setFlyBehavoir(new FlyWithRocket);
$donaldDuck->flyBehavoir->fly();


Output
I am Flying with my own Wings
I am Flying with my own Wings

还有另一种利用这种字符串格式来利用不良字符串的方法:

l = [0x1A, 0xF3, 0x74, 0xA3]
i = int("".join(hex(x)[2:] for x in l), 16)
# And to get the hex representation as requested:
print(hex(i).upper())

答案 3 :(得分:0)

IF NOT EXISTS (SELECT name FROM sys.sql_logins WHERE name='$(dbUserName)')
    BEGIN
        CREATE LOGIN $(dbUserName) WITH PASSWORD='$(dbUserPassword)';
    END
ELSE
    BEGIN
        ALTER LOGIN $(dbUserName) WITH PASSWORD='$(dbUserPassword)';
    END;

相反:

from functools import reduce
reduce(lambda x, y: x<<8 | y, [0x1A, 0xF3, 0x74, 0xA3])
# 452162723
'0x{:X}'.format(452162723)
# '0x1AF374A3'

答案 4 :(得分:0)

mylist =[0x1A, 0xF3, 0x74, 0xA3]

most_significant = str(hex(max(mylist)))
print(most_significant + ''.join([str(el).replace('0x', '') for el in mylist if el != max(mylist)]))

0xf326116163

答案 5 :(得分:0)

您可以将它们分别转换为十进制,然后再转换为十六进制,但删除0x,将它们连接在一起,然后在开头添加0x。 format()擅长进行此类转换。

mylist = [0x1A, 0xF3, 0x74, 0xA3]
result = '0x' + ''.join([format(int(n), 'x')for n in [format(i , 'd') for i in mylist]])

输出:

'0x1af374a3'

答案 6 :(得分:0)

我认为,使用Python bytearray类型有一种干净且“ pythonic”的方式来解决此问题:

foolist = [0x1A, 0xF3, 0x74, 0xA3]
# convert to bytearray and then to a single integer in one line:
x = int.from_bytes(bytearray(foolist), "big")
print(hex(x))
# '0x1af374a3'

如果列表中的最高有效字节位于列表的末尾,请在"little"函数中使用参数"big"而不是int.from_bytes

如果您的列表包含大于255的整数,则会引发ValueError异常:

>>> foolist1 = [0xFF, 255]                                                                                 

>>> bytearray(foolist1)                                                                                    
bytearray(b'\xff\xff')


>>> foolist2 = [0xFF, 256]                                                                                 

>>> bytearray(foolist2)                                                                                    
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: byte must be in range(0, 256)

byte must be in range(0, 256)