Jaffer Wilson
Jaffer Wilson

Reputation: 7273

Some conversion issues between the byte and strings

Here is the I am trying:

import struct

#binary_data = open("your_binary_file.bin","rb").read()

#your binary data would show up as a big string like this one when you .read()
binary_data = '\x44\x69\x62\x65\x6e\x7a\x6f\x79\x6c\x70\x65\x72\x6f\x78\x69\x64\x20\x31\
x32\x30\x20\x43\x20\x30\x33\x2e\x30\x35\x2e\x31\x39\x39\x34\x20\x31\x34\x3a\x32\
x34\x3a\x33\x30'

def search(text):
    #convert the text to binary first
    s = ""
    for c in text:
        s+=struct.pack("b", ord(c))
    results = binary_data.find(s)
    if results == -1:
        print ("no results found")
    else:
        print ("the string [%s] is found at position %s in the binary data"%(text, results))


search("Dibenzoylperoxid")

search("03.05.1994")

And this is the error I am getting:

Traceback (most recent call last):
  File "dec_new.py", line 22, in <module>
    search("Dibenzoylperoxid")
  File "dec_new.py", line 14, in search
    s+=struct.pack("b", ord(c))
TypeError: Can't convert 'bytes' object to str implicitly

Kindly, let me know what I can do to make it functional properly.

I am using Python 3.5.0.

Upvotes: 0

Views: 29

Answers (1)

Kevin
Kevin

Reputation: 76264

s = ""
for c in text:
    s+=struct.pack("b", ord(c))

This won't work because s is a string, and struct.pack returns a bytes, and you can't add a string and a bytes.

One possible solution is to make s a bytes.

s = b""

... But it seems like a lot of work to convert a string to a bytes this way. Why not just use encode()?

def search(text):
    #convert the text to binary first
    s = text.encode()
    results = binary_data.find(s)
    #etc

Also, "your binary data would show up as a big string like this one when you .read()" is not, strictly speaking, true. The binary data won't show up as a big string, because it is a bytes, not a string. If you want to create a bytes literal that resembles what might be returned by open("your_binary_file.bin","rb").read(), use the bytes literal syntax binary_data = b'\x44\x69<...etc...>\x33\x30'

Upvotes: 2

Related Questions