BinUtils
BinUtils copied to clipboard
Swift functions to ease working with binary formats
BinUtils
Swift functions to ease working with binary formats
Installation
Either copy BinUtils.swift into your project, or use Swift Package Manager by adding the following dependency to your Package.swift:
dependencies: [
.Package(url: "https://github.com/nst/BinUtils.git", majorVersion: 0, minor: 1),
]
hexlify(data)
- return the hexadecimal representation of the binary data
- akin to hexlify() in Python binascii module
- for iOS and OS X
let data = "Hello".dataUsingEncoding(.utf8)!
assert(hexlify(data) == "48656C6C6F")
unhexlify(hexstr)
- return the binary data represented by the hexadecimal string hexstr
- akin to unhexlify() in Python binascii module
let s = String(data: unhexlify("48656C6C6F")!, encoding: .utf8)
assert(s == "Hello")
pack(fmt, [v1, v2, ...])
- return data containing the values v1, v2, ... packed according to the given format
- akin to pack() in Python struct module
let d = pack("<h2I3sf", [1, 2, 3, "asd", 0.5])
assert(d == unhexlify("0100 02000000 03000000 617364 0000003f"))
unpack(fmt, string)
- unpack the data according to the given format
- akin to unpack() in Python struct module
let a = unpack(">hBsf", unhexlify("0500 01 41 3fc00000")!)
assert(a[0] as? Int == 1280)
assert(a[1] as? Int == 1)
assert(a[2] as? String == "A")
assert(a[3] as? Double == 1.5)
let f = FileHandle(forReadingAtPath: "/bin/ls")!
let b = unpack("<2H", f.readDataOfLength(4))
f.closeFile()
assert(b[0] as? Int == 64207)
assert(b[1] as? Int == 65261)
caveats
pack() and unpack() should behave as Python's struct module https://docs.python.org/2/library/struct.html BUT:
- native size and alignment
@is not supported - as a consequence, the byte order specifier character is mandatory and must be among
=<>! - native byte order
=assumes a little-endian system (eg. Intel x86) - Pascal strings
pand native pointersPare not supported
Byte Order Format
| Character | Byte Order |
|---|---|
| = | little-endian |
| < | little-endian |
| > | big-endian |
| ! | network (big-endian) |
Format Characters
| Format | C Type | Swift Type | Size |
|---|---|---|---|
| x | pad byte | - | 1 |
| c | char | String of length 1 | 1 |
| b | signed char | Int8 | 1 |
| B | unsigned char | UInt8 | 1 |
| ? | _Bool | Bool | 1 |
| h | short | Int16 | 2 |
| H | unsigned short | UInt16 | 2 |
| i | int | Int32 | 4 |
| I | unsigned int | UInt32 | 4 |
| l | long | Int32 | 4 |
| L | unsigned long | UInt32 | 4 |
| q | long long | Int64 | 8 |
| Q | unsigned long long | Int64 | 8 |
| f | float | Float32 | 4 |
| d | double | Float64 | 8 |
| s | char[] | String |