You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3如何定义长度为1的字节串?解决ljust填充符类型报错问题

问题报错

全网搜索了该问题的相关资源,没有找到可用的解决方案,测试时遇到的报错信息如下:

TypeError: ljust() argument 2 must be a byte string of length 1, not str

测试代码

s = 'test'

s.ljust(6, '\0') or s.ljust(6, '^')
# 以上两种写法都报错

# 改用字节类型填充符也报错
s.ljust(6, b'\0') 
# 或者 
s.ljust(6, b'^')
# 报错信息:TypeError: The fill character must be a unicode character, not bytes

# 相关业务代码
def _str2long(s, w):
    n = len(s)
    m = (4 - (n & 3) & 3) + n
    sb = bytes(s)
    print('====')
    print(sb)
    print(type(sb))
    print(type(_XXTEA_FILL_CHAR))
    s = sb.ljust(m, _XXTEA_FILL_CHAR)
    v = list(struct.unpack('<%iL' % (m >> 2), s))
    if w: v.append(n)
    return v

运行输出

> ==== b't\xf5\xf3)6\x8f\x13##|\xabTd\xf8\xcd\xb9\x88!\x16O~Q\x0c\xed\xee\xc1\xa3\xd15\xda\x0b6\xd0\xdb\xff\xbb\x15\xbe\n\x98\x16\xb7VsI\xbc\xb5\x0e\xed\xc1\xda\x8aii\x0e]V\xe0\x08z\n\xe4\xe9J\x15\x00\xc64\xe0\xfc<\xba:\xe5:\x9d\xffo.\x92\xb9\x7f\x1c\xecm\xcd\xc5\x8f\xb1/\x86/\x954^\xb1\x81<\xe1:fJl!\x1b\x16\xdf\x7f\x818.my#\xc1\xf2"i\xf0\x96\xed\xea\x00F\x1e!\xa9\xbb\xe24fT[\x80yC\x11Q\xd0\n> \xfd\x8b=Is\x14J\xfe\xae\n\x0cMvv7\tz<\xa44S\xb6\x17&\xae\x8f\xa3TJ"J\x9c\x82\x1cY\xe6\xd3\xb2\xb2\xc5Y\xd5\xe9\xff\xa7\xaa\x17K\xed\xdf\x1d\xba\xc76B\x0fr\x066\x0e2.\xce\xda:ML\'\xcd2@\x1e\xb1\x06\t1\x1d9\xf3\x92\xa0@H\xeaZ\xa6\xf8]\x08\x8dA~*\xa0wdO\x881\x93I\xa5\x88\n\x08#\x9f\xe3\x88\xe9+\x04\xd5\xde\x02\xceF\xc1\x0e\x92\x1a\xc4*\x97KMC\'\xd3\xab\xd3\x1c\xe5\x1c\x1b\xb1\xb7\xcf\x95\x8c\xbe\xbd\t\xae\xfdOy\x14\\\x86\x18b\xdc\x97`\xed\xf5\xc7\\\xb4\n\xf2\xb2\xb3~\xc7\x870\xc2\x81\xf71\n\xf2q\x13\xd8\x049\xc1\xd9j\xb0\xcc\x15\xd2i\xb9\x9f\xfe\xa1x\xb5V\x11H\xf5\xd5\xbf]\x9e\xfb\xdd\x11\x8fl\xf3\xe7\xb8]\xd6\xb5*\x86\xd2\xb0\xfb\xebQ\x93\xc8\x05\x1d\xbe8t\x08\xbeK2\xd3\x13Za\x85X\xb7\xb4\xd26\x0cT6\\\xa9e\x80\xd7\x89\xdc\x1b\x8c\x94\xd1j1\n9\x02;d\nd\x1d,\x1f\x18{\xec/|\x18\xeb\xe4\x96\xcbI\xb75\x7f$H=lAu0\x81\xf95\x8b\x18\xfb|\x0c\x97\xf1n\xe5\xe4\x87\x91\x13\xa1\xf5\xb2\xa8\x11\xee\xa5z]\x80\x04&\xd6^,\x96a[F\xef\xefc\n\x03\xc1\x93\x0c7c\xba\xca\xc8\xf0\xf2\xe8_s\xb3\x8e5\xe6\xa9m=\xfdN\x9eG\xdf\xbdR\xdb\x8d1\xf8]n\xa6Rn(\xdbR&$\x06\xe3\xbfW\xeb,\xcf\x17\xe4<\xafh\x07\xe4m\x82\x7f\'\xc7\x83\x82\x9b\xda\xed\xc3U\x08\xc5\xa2}\xff\xa3.\x07\xcb\x80\xc0H\xb9\xf7rZ\x0f\xaeD\x1f\xaf*\xb2VGrO\xfc\x11\xce\x946%\x8d\xd4sI\x06\xbc\xdf\x8aoWy`\x8a{\x00\x9d\xdf\x07\x00\xbf\x02\xc4d\x89c\xb1\x9agW\xff\xa9\xab4\xdd5\x13{\xa9G\xebs_u\xc7\x00|\xad\xc8\xb6\xad|\xf8QcT\xf7\xd0t\xf1\xbf\xc6\x81\x80\x97\x06\xc6\xe9+|W\xa1a\n> \x1f\xfb\xcc\xc7Y2\x8c\xac\xd6(V?\xda\xb0\x89\xa7\xc0(\xec;\xa2V9D\xf9\xa3<\xd3+\xba\xc6\xb4\x8b\x17\x12\x8e\xa8.\xa4~\xeb\xe6Q\xc2\x92\xcb\x9e\xd1A\xb0\x9fS\xca<\xd4zY?n\x12\xecH\xaf\x997\nT\x9a\x1d\xee\xbb\x9a\xb5\xfe\n> \x9ev@\x08\xa8\xaa\x82hc\x98u\xd8\x7f\x80\xfd\x0e_\xfd\x8f\x9f\xf5^\x958<z\xea\x11Ft3\x95\x8e\x8f]\xd9\xe83\xd4\x04\xd6f\x8d\x06Fh\xc6\x7f\xb6B\x13K\x88S\x9d\xae\xbb\xf0\xaaTS\xe2\x1a^e\'"<c0>\x89\xdd%\x83+"0g\xae=\xcf\xa7zg\xc8b\x1c^\xd2\x81mb\x0c)\xca\x94\xcc\xa7\x95\xba\xe4\xde\x1fZ\xa3\x04\xfa\x16\x8c\xb3\xfe\xb5e?\n> A\x99f/R&\x81\xbaH\xf7\x18\x08V$\x82\xfa\x86t|\xb3\x00\xf2\xcb/\x92Z(\x11\xf5\x13\x15\x00\x0f\x9dY\x08\x02\r5mya\x1f\xdf'\n> <class 'bytes'> 
> <class 'bytes'> 
>  Traceback (most recent call last):  
> File "C:\Users\LilPoppy\Downloads\cocos2dx-lite-2d\crypt.py", line
> 162, in <module>
>     main()   File "C:\Users\LilPoppy\Downloads\cocos2dx-lite-2d\crypt.py", line 160, in
> main
>     decrypt(*prepare())   File "C:\Users\LilPoppy\Downloads\cocos2dx-lite-2d\crypt.py", line 143, in
> decrypt
>     decrypt_file(f, key, sign)   File "C:\Users\LilPoppy\Downloads\cocos2dx-lite-2d\crypt.py", line 103, in
> decrypt_file
>     decoded = xxtea_decrypt(data[len(sign):], key)   File "C:\Users\LilPoppy\Downloads\cocos2dx-lite-2d\crypt.py", line 69, in
> xxtea_decrypt
>     k = _str2long(key.ljust(16, _XXTEA_FILL_CHAR), False) TypeError: The fill character must be a unicode character, not bytes
问题原因

Python中str和bytes两种类型的ljust方法对填充符的类型要求完全不兼容:

  • 字符串(str)的ljust要求填充符必须是长度为1的Unicode字符(str类型),不支持传入bytes
  • 字节串(bytes)的ljust要求填充符必须是长度为1的字节串(bytes类型),不支持传入str
    本次报错是因为调用key.ljust时key为str类型,但传入的_XXTEA_FILL_CHAR是bytes类型,触发类型不匹配。
解决方案

可以使用自定义的跨类型左填充方法,兼容str和bytes两种输入:

def left_ajust(s, n, b):
    result = bytearray(s) if type(s) is bytes else bytearray(s, 'utf-8')
    if len(s) < n:
        v = bytearray([])
        for i in range(n - len(s)):
          v[0:0] = b;
        result[len(s):0] = v
    return bytes(result)

如果不想自定义方法,也可以根据输入类型手动统一后调用原生ljust:

  • 待填充内容为str时,将填充符转为str单字符:s.ljust(6, _XXTEA_FILL_CHAR.decode('latin1'))
  • 待填充内容为bytes时,直接调用bytes的ljust方法:bytes(s, 'utf-8').ljust(6, _XXTEA_FILL_CHAR)

内容的提问来源于stack exchange,提问作者HotFlow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:57:02