RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 872835
Accepted
NEStenerus nester
NEStenerus nester
Asked:2020-08-24 15:48:53 +0000 UTC2020-08-24 15:48:53 +0000 UTC 2020-08-24 15:48:53 +0000 UTC

字节到字符串,反之亦然从文件

  • 772

我正在为隐写术制作一个模块,我需要一个函数来删除编码的消息

所以有代码:

def remove_text(filepath):
m = None
with open(filepath, 'rb') as f:
    data = f.read()
    m = str(data).split('2d2a2a2d')[0]

执行后,m类似这样的内容存储在: \xd5\x93+\x9eFJ\xa2\xfc\xe4\xf3\xc0\xae\x1bV\x94\x08.J\xb1\x08\x01\x8d\x963\xf3\xa9e8\x00u\xe3\x9c\x9e\xd5\xc3V\xa2\x8a\xf7\x99\xdfF\x9bG\x9cF\x1eGm\xdc.\xe0\xa8\x08\xfb\xd9==\xab\xd1\xf4\rBD\xbd\x85``\x08\xab\x1al\x90cz\x00Wi \x1c\xf3\xd4\xf1\xd3\xb61\xc61\xad\x1d\x8d\xaaB\\\xb6=\xfbB\xd6R\xd9\xa3u\xb8\x8d\xe61\x98\xe3Dl\xf9\x9b\x81\'\x03\xb9\xc6q\x9eEv\xb6Z\xfa\xcb\x18\x90\xc8\xc5\xbea(\x91p\x8a\xa3\x8d\xd9\xcf\xae\x7f/z\xe9Ub\xf4g\x9f:s\xea\xc6]j\x05\xe3\xb8\x8e\x12\x80\x91\xf7\xddCq\x9c\xf4=\xfd\x0ek\x91\xd4.\xd9\xaeS\xc8\x980\xb8\x03\xe4c\xbdc?\xdf\xcf\xa9\xeb\xc9#\x81\xc0\xef\x8c\xd77\xbc\xf4.\x95+\xb4\xa4\xca\xf0\xcd4[\xbf\x7f\x1c\x9fy\x18:\xab\x91\xb8\x10~\x87\x9e\x0e8\xf5\xcdj\xdaO\x0c\xa7\xcaI\x0c\xb2\x90\t\xde\x85\x19~\x9c\x9c\x83\xeb\xf5\xaf.\xbb\xa0\xa2\xef-U\xef\xe4z\xd40\xcd;\xa9#v\x0bu&E nP\x08|\xe3\xf4\xfc\xbfZ\xdc\x8a[u\x92\xd3\x12G3[\xa7\x97\'\x92\xac\x9b\xc6\xe2NI\x1dpq\xc7e\x15\xe6\xd4\x95\x1bFQg\xab\n.\xdf\x11\xd3\xc0\xc9\xb5D@\x92\x7f\x85:.{\x8e\xc0\x0e\xbf\x85uz\x13Alei\x03I<J\x04RI\x0f\x04\x922W\xf8s\x8f^\xd9\xef\x8a\xe5\xe6\x85\x9b\x8c\x1bw2\xc4G\x96-\'vv\xf0\xcd+\x05\x99\xd4m*\x17,r\x00\xf4\xc0\xe4\xfd\x075\xd4\x9f(+Gj\xe9\xb1\x902\xf9o\xb8\xc8W\xef\x0eyU\xeaFy\xc6>\xb5\xeca\xa9\xd9\xa9r\xe9\xb7\xcd\x1f?\x88s\xea,3M\x02=\xa4E^)

我还没有找到从文件中删除字节的方法,我只想重新保存它(这是一张照片)

with open('abc.jpg', 'wb') as f:
    f.write(m)

但这会引发错误:TypeError: a bytes-like object is required, not 'str'

我知道 m 是一个字符串,但我需要一个字节对象,但内容相同(带有斜杠等)

问题是,如果你尝试这样写:f.write(bytes(m, encoding = 'cp1251'))那么就会出现这样的情况:

\\xe6@\\xd8\\n\\xac\\xa3\\xdc1-\\xe8{\\x01\\x9a\\xcdG\\xf2\\xc4\\x9b\\x0e\\xfc\\xb8U9\\xf9\\x90\\x0e\\xde\\x98\\xe7\\xeb\\xc0\\xe7\\xae|\\xea\\x92\\xbd\\xecvFWV\\xb9\\xa3m$e\\xc6\\x15eX\\x9c;\\x06\\xe3\\xe5\\xe9\\x9c\\xf5\\x00\\x9e3\\xef[v\\xd1\\xa4N$i\\xd1%B\\x0f\\x95 "GV\\xe8W\\xb6\\x07~y\\xdc1\\xde\\xb2\\x8f4Z}\\xc8\\x97/M\\xce\\x82\\r\\xd2K,\\xa02\\x16m\\xf2\\xbe\\xec\\x07c\\xd4(\\x1d8\\xc7\\x18\\xfeu\\xd6\\xdb34h\\xe6\\xd4\\xa32\\x852\\xcb\\xfe\\xb7\\x00u_\\xaf\\x03\\x07\\xa0\\xafN\\x84\\xb6\\xbfs\\x8a\\xaa]\\x11\\xab\\x12\\x9d\\xf1\\xed\\x99V5\\x93\\xf7\\xcaWqu\\xc7L\\xf5^q\\xcf=\\x0f\\x1d\\xebZ\\x0b\\xbb\\x8bh\\xee!V\\x02\\xdeVQ6\\xf5\\x1e\\\\\\xca\\x87#\\x9e\\xa0g\\xe8x\\xafF2\\xe6\\x9bJ\\xe9\\\'\\xf7\\x9c\\x93^E\\x9by\\xee\\xb0F\\xf7\\x8e\\xdd\\x9b\\xf8X\\xaf\\x99\\xd7\\x93\\x8e8\\xcb\\x009\\xe0\\xfe\\x15\\xa5g?\\x939(x\\\'\\xe6\\x0cs\\xe6v\\xe6\\xba\\x14\\x96\\xef~\\xe73Qm&\\x8b\\xd9\\x8d\\xa4hD\\x9b\\x1d\\xb9\\xce2[\\xbe?\\x1e\\x80\\xfd*\\xbe\\xe9#\\x98\\x88\\x972/\\xc8VhD\\x89\\x81\\xc1\\x18#\\xaf^OC\\x83\\\\5j\\xb9W\\x94i\\xc1\\xe9mo\\xa3\\xf2*\\x11\\x84z\\x1b\\xfaPV\\x0c\\xca\\x08Em\\xf1\\xa9a\\xc3\\x028=;g\\x9095\\xe9z~\\xd9\\xa3\\n\\x0b\\x81\\xb9[#\\xee\\x92:\\x0f\\xe7]q\\xc2)ET\\x93\\xb2\\xbd\\x8c\\xe7R1\\x93M\\x1b2%\\xad\\xad\\xcb6\\xe9KyK \\n\\xd9\\x01\\x88\\xc1\\xcf\\xb1\\xe4\\x8e\\xd5\\x89\\xa8_\\xb0,\\xf1\\x80Q0\\x87\\xb0\\x07\\x9f\\xd7\\xfc+\\xd2T\\xe1Rr\\xb2\\xba\\xe5\\xb2\\xd3\\xeff.\\xacU\\x8eJ\\xfaV\\xb8\\x929\\x89o\\x9c\\x9f7\\x8d\\x87\\x8fO\\xd3\\xb5q\\xd76\\xca\\xfb\\x98\\xb6&y\\xcc\\x8c\\xcc\\xdf\\x7f=\\x87a\\x80?Rk\\x8aT\\x94V\\x9d\\r!QJ\\xd79\\xddK\\x9b\\x82R0\\xb1>\\x11\\n\\x92\\xe4\\x1e\\x84\\xee\\xee\\x0f\\xe9YW0\\x0c$N\\xc1\\x19G/\\x92\\xdb\\xfb\\xe4\\xf6\\xf4\\x1cq\\xd2\\xbc\\x9cO4#x+\\x9e\\x85){\\xcfS\\x02x\\xe4\\x89\\xc9\\x8c\\xb2\\x82\\x0f\\xef@\\xf9\\x94\\x8eA\\x1c\\xd6\\x13\\x19Vei@uL\\xf6\\xces\\xc0\\xfck\\xcb\\xaa\\xde\\xfd\\xce\\xd85\\xd5\\x9b1mh\\x9c+1I0\\xdb@\\x03\\x04g\\xdc\\xf4$\\xe0\\xf1\\x9fNqW\\x0b\\xc0\\x91\\xb4\\xd72\\xc2\\x11PG\\x10\\xc1\\r\\x1bw;\\xba\\x1c\\xe3\\xf2\\xfc*\\xe9\\xc1\\xb9{\\xba\\x95\\xed\\x12"i&1<V\\xf3\\xcb\\x15\\xad\\xde\\x05\\xc4"L$\\xc4tb:\\xf1\\xdb\\xd2\\xa0K\\x99\\xe0\\x91\\xcc\\xb1K\\xe5\\xa6#\\xf3\\x14\\x0c\\xca\\x14|\\xa1\\x7f\\x96~\\xb4\\xaa\\xd3\\x96\\xb6wf\\xd1\\xaa\\x9aH\\xd5\\x86LF\\x97\\x98T,

如何在没有双斜杠但类型为字节的情况下获得最高值?

python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    insolor
    2020-08-24T16:17:30Z2020-08-24T16:17:30Z

    只是不要str(data),让字节保持原样。字节也有一个方法split,所以你可以这样做:

    m = data.split(b'\x2d\x2a\x2a\x2d')[0]
    

    (假设 2d 等表示十六进制字节值)

    如果您需要编辑字节,您可以bytes强制转换为bytearray,然后,例如,您可以按索引编辑单个字节。或者只是将物体bytes分成单独的部分,粘贴所需的部分,然后将其粘回去。

    回复评论

    让我们创建一个测试二进制文件:

    import random
    
    with open('test.bin', 'wb') as file:
        file.write(bytes(random.randint(0, 255) for _ in range(33)))
        file.write(b'-**-')
        file.write(b'Some text')
    

    使用十六进制编辑器打开,确保有一个字符串-**-(以十六进制表示为 bytes 2D 2A 2A 2D):

    截屏

    让我们以不同的方式检查所需字符的存在:

    from binascii import hexlify
    
    with open('test.bin', 'rb') as file:
        data = file.read()
        print(data)  # b':\xcb\x04\xd5n\xcd\xbe\xb1\x17\x86\r\xa4\xabM\n\xb2LUU\xa8\x0f\x98\xa9\x15\x0b\xeb\x14\x83\xd5\x04i\xc0l-**-Some text'
        print('2d2a2a2d' in str(data))  # False
        print('-**-' in str(data))  # True
        print(b'2d2a2a2d' in hexlify(data))  # True - но этот способ не надежный, т.к. сработает например и на байты a2 d2 a2 a2 d2
        print(b'\x2d\x2a\x2a\x2d' in data)  # True
        print(b'-**-' in data)  # True
    
        # Теперь проверяем способ из начала ответа:
        m, n = data.split(b'-**-')  # В m попадает начало файла до строки -**-, в n - все остальное
        print(n)  # b'Some text'
    

    最有可能的是,您实际上添加到文件的不是 text '-**-',而是 text '2d2a2a2d'(不是这些十六进制代码表示的字节,而是这些数字和字母)。

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5