title: Read and write binary file in Python
body: <p>The following code does not seem to read/write binary form correctly. It should read a binary file, bit-wise XOR the data and write it back to file. There are not any syntax errors but the data does not verify and I have tested the source data via another tool to confirm the xor key.</p>
  
  <p><strong>Update</strong>: per feedback in the comments, this is most likely due to the endianness of the system I was testing on.</p>
  
  <p><a href="http://code.google.com/p/malwarecookbook/source/browse/trunk/12/1/xortools.py" rel="nofollow noreferrer">xortools.py</a>:</p>
  
  <pre><code>def four_byte_xor(buf, key):
      out = ''
      for i in range(0,len(buf)/4):
          c = struct.unpack("=I", buf[(i*4):(i*4)+4])[0]
          c ^= key
          out += struct.pack("=I", c)
      return out
  </code></pre>
  
  <p>Call to xortools.py:</p>
  
  <pre><code>from xortools import four_byte_xor
  in_buf = open('infile.bin','rb').read()
  out_buf = open('outfile.bin','wb')
  out_buf.write(four_byte_xor(in_buf, 0x01010101))
  out_buf.close()
  </code></pre>
  
  <p>It appears that I need to read bytes per <a href="https://stackoverflow.com/a/1035360/666891">answer</a>. How would the function above incorporate into the following as the function above manipulate multiple bytes? Or Does it not matter? Do I need to use <a href="http://docs.python.org/library/struct.html" rel="nofollow noreferrer">struct</a>?</p>
  
  <pre><code>with open("myfile", "rb") as f:
      byte = f.read(1)
      while byte:
          # Do stuff with byte.
          byte = f.read(1)
  </code></pre>
  
  <p>For an example the following file has 4 repeating bytes, 01020304:</p>
  
  <p><img src="https://i.stack.imgur.com/ra4Xq.png" alt="before XOR"></p>
  
  <p>The data is XOR'd with a key of 01020304 which zeros the original bytes:</p>
  
  <p><img src="https://i.stack.imgur.com/CBtPB.png" alt="after XOR"></p>
  
  <p>Here is an attempt with the original function, in this case 05010501 is the result which is incorrect:</p>
  
  <p><img src="https://i.stack.imgur.com/sUvz2.png" alt="incorrect XOR attempt"></p>