给定一个十六进制整数列表,我想以一个十六进制整数结尾,在该十六进制整数中,整数被视为最高有效的最后一个和最低有效的最后一个。
例如,给定... [0x1A,0xF3、0x74、0xA3]
...我想结束 0x1AF374A3
在我熟悉的另一种编程语言中,这是一个相当简单的操作,称为“ join”,但是显然“ join”在Python中意味着其他含义。
我知道我可以遍历列表,将每个后续元素乘以2 ^并相加。我也知道我可以将元素转换为字符串,将它们连接起来,然后再转换回整数。但是这两种方法都显得笨拙。似乎应该有一个更简单/更优雅的方式。有吗?
在此先感谢您的帮助!
答案 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)