module BinaryStrings { @Inject Console console; void run() { Byte[] mutableBytes = new Byte[]; // growable and mutable string of bytes Byte[] fixedLength = new Byte[10]; // fixed length string of bytes (all default to 0) Byte[] literal = [0, 1, 7, 0xff]; // a "constant" string of bytes console.print($|String creation and assignment: | mutableBytes={mutableBytes} | fixedLength={fixedLength} | literal={literal} | ); console.print($|Check if a string is empty: | mutableBytes.empty={mutableBytes.empty} | fixedLength.empty={fixedLength.empty} | literal.empty={literal.empty} | ); mutableBytes += 0; // add a byte (using an operator) mutableBytes.add(1); // add a byte (using the underlying method) mutableBytes.addAll(#07FF); // add multiple bytes (using the underlying method) console.print($|Append a byte to a string: | mutableBytes={mutableBytes} | ); console.print($|String comparison: | mutableBytes==literal = {mutableBytes==literal} | fixedLength==literal = {fixedLength==literal} | ); fixedLength = new Byte[4](i -> literal[i]); // create/copy from literal to fixedLength val clone = fixedLength.duplicate(); // clone the array console.print($|String cloning and copying: | fixedLength={fixedLength} | clone={clone} | ); console.print($|Extract a substring from a string: | mutableBytes[1..2]={mutableBytes[1..2]} | fixedLength[0..2]={fixedLength[0..2]} | literal[2..3]={literal[2..3]} | ); for (Int start = 0; Int index := fixedLength.indexOf(0x01, start); start = index) { fixedLength[index] = 0x04; } console.print($|Replace every occurrence of a byte in a string with another string: | fixedLength={fixedLength} | ); for (Int start = 0; Int index := mutableBytes.indexOf(#0107, start); start = index) { mutableBytes.replaceAll(index, #9876); } console.print($|Replace every occurrence of a string in a string with another string: | mutableBytes={mutableBytes} | ); console.print($|Join strings: | mutableBytes+fixedLength+literal={mutableBytes+fixedLength+literal} | ); } }