【问题标题】:Best way to Convert pairs of base 10 integers to ascii characters in python在python中将基数为10的整数对转换为ascii字符的最佳方法
【发布时间】:2015-06-11 23:38:29
【问题描述】:

我正在使用串行接口与一台测试设备通话。设备的两个字母 ascii ID 在特定寄存器中编码为基数为 10 的整数。每对整数都需要转换为一个 ascii 字符。我的问题是进行这种转换的最佳方法是什么。我使用了下面的方法,但对于一个如此简单的任务来说,它似乎相当复杂。

例子

输入:5270 所需输出:'4F'(ascii 值为 52 和 70)

get the raw register value
>>> result =f4.read_register(0,)
>>> result
5270
convert the integer into a list of chars
>>> chars = [i for i in str(result)]
join the pairs together
>>> pairs = [''.join((chars[x], chars[x+1])) for x in xrange(0,len(chars),2)]
>>> pairs
['52', '70']

>>> pairs = [chr(int(x)) for x in pairs]
>>> pairs
['4', 'F']

【问题讨论】:

    标签: python python-2.7 ascii


    【解决方案1】:

    除了@BhargavRao 回答,您还可以使用divmod 内置:

    num = 5270
    ''.join(map(chr, divmod(num, 100)))
    
    # '4F'
    

    你也可以使用字符串格式化:

    '{:c}{:c}'.format(*divmod(num, 100))
    
    # '4F'
    

    【讨论】:

    • 当这出现时,我正要点击“发布您的答案”... :)
    • 我要在我的回答中指出,这只适用于 Python 2,它会产生 lists,而 Python 3 会产生专门的对象(在这种情况下是 map 对象)。现在已经注意到了。
    • @TigerhawkT3 OP 正在使用 Py2。但是有必要提一下。
    • 感谢@Bhargav Rao,py3 中的 TigerhawkT3 创建了一个地图对象,但 join 确实适用于地图对象。
    • @DTing: 是的,str.join 在 2.x 和 3.x 中都接受任何可迭代的字符串,因此您不必担心 map 返回列表还是在此处映射迭代器(除非您正在对代码进行微优化),因此您不妨编写在 2.x 和 3.x 中都可以使用的最简单的东西,就像您所做的那样。
    【解决方案2】:

    添加一点数学知识。

    • / - 整数除法
    • % - 模运算符

    代码

    >>> num = 5270
    >>> pairs = [chr(num/100),chr(num%100)]
    >>> pairs
    ['4', 'F']
    

    并匹配所需的输出

    >>> ''.join(pairs)
    '4F'
    

    【讨论】:

    • 我认为(尽管他的问题不是很清楚)他实际上有一串这样的一个或多个 4 字符组,不一定只有一个。但即便如此,这个答案对于适应这种情况来说是微不足道的:首先将字符串分成 4 个字符组,然后对每个组执行此操作。或者,或者,循环打开 %-ing 一次关闭 2 位数字,然后 chring 他们。
    • @abarnert 是的。但是 OP 确实提到输入是5270。所以我猜他已经用一些技巧完善了他的输入。
    • 在这种情况下,寄存器只包含一个 4 位整数,因此原始答案可以工作。在其他情况下,寄存器包含较大的 ascii 编码整数,因此 abarnert 的建议在这种情况下会有所帮助。
    • @user3067612 很高兴看到它对您有所帮助。万事如意
    猜你喜欢
    • 2023-03-05
    • 2011-04-13
    • 1970-01-01
    • 2010-10-29
    • 2014-06-21
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多