@code{(require 'byte)} @ftindex byte @noindent Some algorithms are expressed in terms of arrays of small integers. Using Scheme strings to implement these arrays is not portable vis-a-vis the correspondence between integers and characters and non-ascii character sets. These functions abstract the notion of a @dfn{byte}. @cindex byte @cindex byte @defun byte-ref bytes k @var{k} must be a valid index of @var{bytes}. @code{byte-ref} returns byte @var{k} of @var{bytes} using zero-origin indexing. @end defun @deffn {Procedure} byte-set! bytes k byte @var{k} must be a valid index of @var{bytes}, and @var{byte} must be a small nonnegative integer. @code{byte-set!} stores @var{byte} in element @var{k} of @var{bytes} and returns an unspecified value. @c @end deffn @defun make-bytes k byte @defunx make-bytes k @code{make-bytes} returns a newly allocated byte-array of length @var{k}. If @var{byte} is given, then all elements of the byte-array are initialized to @var{byte}, otherwise the contents of the byte-array are unspecified. @end defun @defun bytes-length bytes @code{bytes-length} returns length of byte-array @var{bytes}. @end defun @defun bytes byte @dots{} Returns a newly allocated byte-array composed of the small nonnegative arguments. @end defun @defun list->bytes bytes @code{list->bytes} returns a newly allocated byte-array formed from the small nonnegative integers in the list @var{bytes}. @end defun @defun bytes->list bytes @code{bytes->list} returns a newly allocated list of the bytes that make up the given byte-array. @end defun @noindent @code{Bytes->list} and @code{list->bytes} are inverses so far as @code{equal?} is concerned. @findex equal? @defun bytes->string bytes Returns a new string formed from applying @code{integer->char} to each byte in @code{bytes->string}. Note that this may signal an error for bytes having values between 128 and 255. @end defun @defun string->bytes string Returns a new byte-array formed from applying @code{char->integer} to each character in @code{string->bytes}. Note that this may signal an error if an integer is larger than 255. @end defun @defun bytes-copy bytes Returns a newly allocated copy of the given @var{bytes}. @end defun @defun subbytes bytes start end @var{bytes} must be a bytes, and @var{start} and @var{end} must be exact integers satisfying @center 0 <= @var{start} <= @var{end} <= @w{@t{(bytes-length @var{bytes})@r{.}}} @code{subbytes} returns a newly allocated bytes formed from the bytes of @var{bytes} beginning with index @var{start} (inclusive) and ending with index @var{end} (exclusive). @end defun @deffn {Procedure} bytes-reverse! bytes Reverses the order of byte-array @var{bytes}. @end deffn @defun bytes-reverse bytes Returns a newly allocated bytes-array consisting of the elements of @var{bytes} in reverse order. @end defun @noindent @cindex binary Input and output of bytes should be with ports opened in @dfn{binary} @cindex binary mode (@pxref{Input/Output}). Calling @code{open-file} with @r{'rb} or @findex open-file @r{'wb} modes argument will return a binary port if the Scheme implementation supports it. @defun write-byte byte port @defunx write-byte byte Writes the byte @var{byte} (not an external representation of the byte) to the given @var{port} and returns an unspecified value. The @var{port} argument may be omitted, in which case it defaults to the value returned by @code{current-output-port}. @findex current-output-port @end defun @defun read-byte port @defunx read-byte Returns the next byte available from the input @var{port}, updating the @var{port} to point to the following byte. If no more bytes are available, an end-of-file object is returned. @var{port} may be omitted, in which case it defaults to the value returned by @code{current-input-port}. @findex current-input-port @end defun @noindent When reading and writing binary numbers with @code{read-bytes} and @code{write-bytes}, the sign of the length argument determines the endianness (order) of bytes. Positive treats them as big-endian, the first byte input or output is highest order. Negative treats them as little-endian, the first byte input or output is the lowest order. @noindent Once read in, SLIB treats byte sequences as big-endian. The multi-byte sequences produced and used by number conversion routines @pxref{Byte/Number Conversions} are always big-endian. @defun read-bytes n port @defunx read-bytes n @code{read-bytes} returns a newly allocated bytes-array filled with @code{(abs @var{n})} bytes read from @var{port}. If @var{n} is positive, then the first byte read is stored at index 0; otherwise the last byte read is stored at index 0. Note that the length of the returned byte-array will be less than @code{(abs @var{n})} if @var{port} reaches end-of-file. @var{port} may be omitted, in which case it defaults to the value returned by @code{current-input-port}. @end defun @defun write-bytes bytes n port @defunx write-bytes bytes n @code{write-bytes} writes @code{(abs @var{n})} bytes to output-port @var{port}. If @var{n} is positive, then the first byte written is index 0 of @var{bytes}; otherwise the last byte written is index 0 of @var{bytes}. @code{write-bytes} returns an unspecified value. @var{port} may be omitted, in which case it defaults to the value returned by @code{current-output-port}. @end defun @noindent @code{subbytes-read!} and @code{subbytes-write} provide lower-level procedures for reading and writing blocks of bytes. The relative size of @var{start} and @var{end} determines the order of writing. @deffn {Procedure} subbytes-read! bts start end port @deffnx {Procedure} subbytes-read! bts start end Fills @var{bts} with up to @code{(abs (- @var{start} @var{end}))} bytes read from @var{port}. The first byte read is stored at index @var{bts}. @code{subbytes-read!} returns the number of bytes read. @var{port} may be omitted, in which case it defaults to the value returned by @code{current-input-port}. @end deffn @defun subbytes-write bts start end port @defunx subbytes-write bts start end @code{subbytes-write} writes @code{(abs (- @var{start} @var{end}))} bytes to output-port @var{port}. The first byte written is index @var{start} of @var{bts}. @code{subbytes-write} returns the number of bytes written. @var{port} may be omitted, in which case it defaults to the value returned by @code{current-output-port}. @end defun