Committing initial intro work
parent
ab6a12f875
commit
d6d7114eec
@ -0,0 +1,7 @@
|
||||
# Bluetooth
|
||||
|
||||
This section contains code or examples in interacting with Bluetooth from the Mac.
|
||||
|
||||
## Library
|
||||
|
||||
This code is primarily built using [Pybluez](https://github.com/pybluez/pybluez).
|
@ -0,0 +1,7 @@
|
||||
# Learning binary with Python
|
||||
|
||||
This section is targeted towards the interaction with binary data from Python.
|
||||
|
||||
## Resources
|
||||
|
||||
- https://pymotw.com/2/struct/
|
@ -0,0 +1,8 @@
|
||||
"""
|
||||
Contains various helper functions for dealing with binary or hex values in Python.
|
||||
"""
|
||||
|
||||
|
||||
def get_bin(value, padn=0, sep=None):
|
||||
"""Prints a binary textual representation of a value"""
|
||||
return format(value, 'b').zfill(padn)
|
@ -0,0 +1,39 @@
|
||||
"""
|
||||
Module explores the builtins functions for working with some binary data.
|
||||
"""
|
||||
import sys
|
||||
|
||||
print("This device's native byteorder is: {}\n".format(sys.byteorder))
|
||||
|
||||
# One word (16 bit) Hex number
|
||||
dead_hex = 0xDEAD # 57005
|
||||
beef_hex = 0xBEEF
|
||||
print("hex: {} int: {} bin: {} bitlength: {}\n".format(hex(dead_hex), dead_hex, bin(dead_hex), dead_hex.bit_length()))
|
||||
|
||||
# Binary numbers
|
||||
|
||||
deadbeef_bin = 0xDEADBEEF
|
||||
|
||||
print("int.bin_to_bytes type : {}".format(type(deadbeef_bin.to_bytes(4, byteorder="big")))) # immutable type
|
||||
print("0xDEADBEEF big endian bin : {}".format(deadbeef_bin.to_bytes(4, byteorder="big")))
|
||||
print("0xDEADBEEF little endian bin : {}".format(deadbeef_bin.to_bytes(4, byteorder="little")))
|
||||
|
||||
print("0xDEADBEEF in native endian : {}".format(deadbeef_bin.to_bytes(4, byteorder=sys.byteorder)))
|
||||
|
||||
# Error checking in to bytes
|
||||
try:
|
||||
deadbeef_bin.to_bytes(1, byteorder=sys.byteorder)
|
||||
except OverflowError:
|
||||
print("Caught an overflow error when too few bytes were attempted to represent a 32bit value")
|
||||
|
||||
print("Sign matters. Signed binary values use 2's complement.")
|
||||
value = 0b11111111 # 255 unsigned -1 when signed
|
||||
bytes_value = value.to_bytes(1, byteorder=sys.byteorder)
|
||||
print("Unsigned value: {}".format(int.from_bytes(bytes_value, byteorder=sys.byteorder, signed=False)))
|
||||
print("signed value: {}".format(int.from_bytes(bytes_value, byteorder=sys.byteorder, signed=True)))
|
||||
|
||||
|
||||
## Binascii
|
||||
|
||||
# As it says in the standard lib docs this package is for converting binary/ascii
|
||||
|
@ -0,0 +1,59 @@
|
||||
import struct
|
||||
import binascii
|
||||
|
||||
|
||||
def get_bin(value, padn=0, sep=None):
|
||||
"""Prints a binary textual representation of a value in """
|
||||
return format(value, 'b').zfill(padn)
|
||||
|
||||
|
||||
# Packing a data structure
|
||||
|
||||
values = (1, b'ab', 2.7)
|
||||
s = struct.Struct('I 2s f')
|
||||
packed_data = s.pack(*values)
|
||||
|
||||
print("\n##### Struct Packing Example #####\n\n")
|
||||
print('Original values :', values)
|
||||
print('Packed Type :', type(packed_data))
|
||||
# This is most likely going to contain non ascii characters when printed.
|
||||
# So it's not suitable to copy it over the printed string and then try to
|
||||
# hexlify
|
||||
print('Packed print :', packed_data)
|
||||
print('Format string :', s.format)
|
||||
print('Uses :', s.size, 'bytes')
|
||||
print('Packed Value (hex) :', binascii.hexlify(packed_data))
|
||||
# binascii.hexlify(data[, sep[, bytes_per_sep=1]]) can also make more
|
||||
# human readable values
|
||||
print('Spaced Value (hex) :', binascii.hexlify(packed_data, b"_", 4))
|
||||
|
||||
# Unpacking a data structure
|
||||
|
||||
packed_data = binascii.unhexlify('0100000061620000cdcc2c40')
|
||||
|
||||
unpacked_data = s.unpack(packed_data)
|
||||
|
||||
print("\n##### Struct Unpacking Example #####\n\n")
|
||||
print('Unpacked Values:', unpacked_data)
|
||||
|
||||
# Endianness in binary data
|
||||
|
||||
print("\n##### Endianness Demonstration #####\n\n")
|
||||
print('Original values:', values)
|
||||
|
||||
endianness = [
|
||||
('@', 'native, native'),
|
||||
('=', 'native, standard'),
|
||||
('<', 'little-endian'),
|
||||
('>', 'big-endian'),
|
||||
('!', 'network'),
|
||||
]
|
||||
|
||||
for code, name in endianness:
|
||||
s = struct.Struct(code + ' I 2s f')
|
||||
packed_data = s.pack(*values)
|
||||
|
||||
print('Format string :', s.format, 'for', name)
|
||||
print('Uses :', s.size, 'bytes')
|
||||
print('Packed Value :', binascii.hexlify(packed_data))
|
||||
print('Unpacked Value :', s.unpack(packed_data), "\n")
|
Loading…
Reference in New Issue