The most common subclass is the ByteBlockRectangularWindow, which defines a window with a specified number of rows and columns, starting at a specified position (row and column) in the base block, which "wraps" if necessary onto subsequent rows. For example, using the AirPort base block, a rectangular window which starts at row 0, column 8, of the base block, and 1 row and 32 columns, will wrap onto rows 1 and 2, ending with the byte in column 7 of row 2. These rectangular windows also accomodate some of the more unusual field organizations in the AirPort, such as the 2-column-wide ("vertically oriented") network name field, as well as simple single-byte (1 row by 1 column) indicator or count fields.
A subclass of ByteBlockRectangularWindow is ByteBlockMaskedWindow, which includes a mask applied to each byte before reading or writing a value (only the bits in each byte corresponding to 1's in the mask are read or written). These masked windows are useful when a byte is "shared" by two indicators - for example, the high-order 4 bits might indicate the state of one parameter, while the low-order bits indicate the state of another.
Finally, the ByteBlockMultiWindow subclass of ByteBlockWindow permits a field to be comprised of multiple windows which are viewed as a single contiguous field for reading and writing. For example, the field for the DNS server IP address in the AirPort memory block consists of the first two bytes of the address in one location and the the other two in another location, with other data located in between. To accomodate this, a ByteBlockMultiWindow can be created, and two 2-byte ByteBlockRectangularWindows created at the appropriate locations and then added to the ByteBlockMultiWindow. Note that the order in which information is written to the windows comprising the multi-window is determined by the order in which they are added to the multi-window. Also note that the comprising windows need not be disjoint, but that the later-added windows will overwrite overlapping entries in the earlier-added windows when a value is written.
The basic operations for any window are getBytes(), clearBytes(), and setBytes(); note that writing is truncated at the window edge if the byte array being written is larger than the window.