我想转换一个字符列表(在单个字节上表示,即范围[0,255]),用[-128,127]范围内的整数表示。我已经读过Python的模运算符(%
)总是返回一个与分母具有相同符号的数字。
在Python中进行此转换的正确方法是什么?
修改
使用ord
映射到[128,255]的字符应重新映射到[-128,-1],128映射到-128,255映射到-1。 (对于转换的反转,我使用chr(my_int%256)
,但my_int
可以是负数。)
答案 0 :(得分:5)
# gotcha|pitfall: my original idea, but this generates a list of 1-tuples:
# x = [struct.unpack("b",a) for a in charlist]
fmt = "%ib"%len(charlist) # eg. "5b", if charlist's length is 5
x = struct.unpack(fmt,charlist) # tuple of ints
答案 1 :(得分:2)
不确定我是否明白这个问题......你想做那样的事情吗?
[i - 255 if i > 127 else i for i in [ord(l) for l in "azertyuiopqsdféhjklm3{"]]
答案 2 :(得分:1)
def to_ints(input):
return [o if o <= 128 else 255 - o for o in [ord(char) in input]]
def to_str(input):
return "".join([chr(i%256) for i in input])
out = to_ints("This is a test")
print to_str(out)
答案 3 :(得分:0)
我想知道“字符列表”是什么意思,它们是数字吗?如果是这样,我认为x % 256 - 128
或x % -256 + 128
应该有用。
答案 4 :(得分:0)
这是一个古老的问题,但是对于将来的读者而言,单整数的直接解决方案是(x + 128)%256 - 128
。如果处理字符数据,请将x
替换为ord(c)
。
%
运算符的结果与x + 128
一致(模数256);并从中减去128,使最终结果与x
相等,并将范围移至[128,127]。
这将在生成器表达式中起作用,并在Python 3中保存一个步骤,您需要在该步骤中将字符串转换为bytes
对象。