# PyBinaryReader
A python module for basic binary file IO.

This is something I wrote to use in my personal projects, but feel free to use it if you like!

# Installation
`pip install binary-reader`

# Usage
```py
from binary_reader import BinaryReader
```

Here is some example usage on creating and using a BinaryReader to read a small part of the DDS header:

```py
f = open("example.dds", "rb")  # Open a file in binary mode

reader = BinaryReader(f.read())  # Create a new BinaryReader from the file buffer (we can close the file afterwards)

# Read the magic as a UTF-8 encoded string and compare it to the correct magic
if reader.read_str(4) != 'DDS ':
    raise Exception('Incorrect magic.')

size = reader.read_uint32()  # Read the next 4 bytes as an unsigned 32-bit integer
```

Another example on using BinaryReader features to navigate through a buffer:

```py
some_offset = reader.read_uint32()  # Read an offset that we want to move to

prev_pos = reader.pos()  # Store the current position so we can return back later
reader.seek(some_offset)  # Set the current position in the file to that offset

vector = reader.read_float(3)  # Read 3 consecutive 32-bit floats, return them as a tuple

reader.seek(prev_pos)  # Go back to the previous position

reader.seek(4, whence=1)  # In addition to absolute seeking, we can also seek relative to the current position...

reader.seek(0, whence=2)  # And relative to the end of the buffer. This will set the position to be the last index in the buffer

```

In addition to reading, you can also write to a new buffer:
```py
writer = BinaryReader()  # Create a new BinaryReader (bytearray buffer is initialized automatically)

writer.set_endian(is_big_endian=True)  # Set the endianness to big endian

writer.write_str('MGIC')
writer.write_uint32(20)

writer.align(0x10)  # Align the buffer to 0x10 (in this case, will append 8 bytes to the buffer)

writer.pad(0xF0)  # Add 0xF0 bytes of padding
print(writer.size())  # This should print 256 (0x100)

# Write the buffer to a new file
with open('examplefile', 'wb') as f:
    f.write(writer.buffer())
```

These are the types that can be used with BinaryReader. Just add `read_` or `write_` before the type to get the method name:
```
uint8, int8,
uint16, int16, half_float
uint32, int32, float
uint64, int64,
bytes, str
```

# License
This project uses the MIT License, so feel free to include it in whatever you want.
