代码之家  ›  专栏  ›  技术社区  ›  Tampa

python3-我需要4\u0000\但得到4\x00\

  •  0
  • Tampa  · 技术社区  · 4 年前

    我完全不理解以下内容:

    我需要用json发送一条如下所示的消息:

    ff = "4\x00\xe6\x8c\xc0b\x02c\x023\x02\x01\x02\x00\xe2\xea\xa8\xab\x02\xd6\x92\xe8\x87\x02\x88\xfd\x01\x0ez\x94\x01\x02B\x02\x00\x02\x00\x00"  
    
    print (json.dumps({"a":ff}))
    
    {"a": "4\u0000\u00e6\u008c\u00c0b\u0002c\u00023\u0002\u0001\u0002\u0000\u00e2\u00ea\u00a8\u00ab\u0002\u00d6\u0092\u00e8\u0087\u0002\u0088\u00fd\u0001\u000ez\u0094\u0001\u0002B\u0002\u0000\u0002\u0000\u0000"}
    

    gg =  b'4\x00\xe6\x8c\xc0b\x02c\x023\x02\x01\x02\x00\xe2\xea\xa8\xab\x02\xd6\x92\xe8\x87\x02\x88\xfd\x01\x0ez\x94\x01\x02B\x02\x00\x02\x00\x00'
    
    
    
    print (json.dumps({"a": repr(gg)[2:-1]}))
    
    {"a": "4\\x00\\xe6\\x8c\\xc0b\\x02c\\x023\\x02\\x01\\x02\\x00\\xe2\\xea\\xa8\\xab\\x02\\xd6\\x92\\xe8\\x87\\x02\\x88\\xfd\\x01\\x0ez\\x94\\x01\\x02B\\x02\\x00\\x02\\x00\\x00"}
    

    我需要的是ff被当作gg抛弃。

    为什么?我通过zmq从python向go传递消息,并从go解码avro。当我将二进制代码硬编码为字符串(ff)时,所有代码都在go中工作。当我在python中有一个二进制文件并将其转换为字符串并发送到go时,它无法解码。我让我的json将\U置于\x之上,我很好。

    如果我做到了以下几点,它就会起作用:

    json.dumps({"a": gg.decode('unicode-escape') })
    {"a": "4\u0000\u00e6\u008c\u00c0b\u0002c\u00023\u0002\u0001\u0002\u0000\u00e2\u00ea\u00a8\u00ab\u0002\u00d6\u0092\u00e8\u0087\u0002\u0088\u00fd\u0001\u000ez\u0094\u0001\u0002B\u0002\u0000\u0002\u0000\u0000"}
    
    2 回复  |  直到 4 年前
        1
  •  0
  •   Bob Jarvis - Слава Україні    4 年前

    您需要将字节转换为字符串。问题是-字符串的正确字符集是什么?我尝试通过使用

    print (json.dumps({"a": str(gg, 'windows-1252')}))
    

    但是得到

    "4\u0000\u00e6\u0152\u00c0b\u0002c\u00023\u0002\u0001\u0002\u0000\u00e2\u00ea\u00a8\u00ab\u0002\u00d6\u2019\u00e8\u2021\u0002\u02c6\u00fd\u0001\u000ez\u201d\u0001\u0002B\u0002\u0000\u0002\u0000\u0000"

    这是相似但不完全相同的。我试过“utf-8”,但失败了,因为

    UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 2-3: invalid continuation byte
    

    所以不要去那里。但我认为这是你前进的道路。

    repl.it here