Here is a small example to clarify the relation between the field specifiers and the arguments:
binary format d3d {1.0 2.0 3.0 4.0} 0.1The first argument is a list of four numbers, but because of the count of 3 for the associated field specifier, only the first three will be used. The second argument is associated with the second field specifier. The resulting binary string contains the four numbers 10, 2.0, 3.0 and 0.1.Each type-count pair moves an imaginary cursor through the binary data, storing bytes at the current position and advancing the cursor to just after the last byte stored. The cursor is initially at position 0 at the beginning of the data.See also:
RJM asks (2004-07-27): What about sending numeric expression results as binary representation to files or communication channels? It can be coded this way (example with one and two values to being sent):
puts $fid [binary format S1 [expr {...}]]
puts $fid [binary format S2 "[expr {...}] [expr {...}]"]Contrary to the simple case of set a [expr {...}]where no intermediate number<->string conversions takes place, since smart Tcl writes the real or int value result directly in a. However, conversion to binary output seems to involve string conversion (expr result) and then conversion to binary during binary format execution, as time investigations seem to confirm. binary scan does not necessarily have this superfluous string conversion, because the command provides a reference to a target variable and hence can handle the processing from source (binary) to target (binary representation) monolithically.Expert contributions very welcome!BR: See Working with binary data for a description how strings and binary data relate. There should be no visible conversions from the POV of Tcl scripts.Lars H: I'm hardly an expert, but aren't the arguments supposed to be lists? The man page says (about the c format specifier) that- If no count is specified, then arg must consist of an integer value; otherwise arg must consist of a list containing at least count integer elements.
puts $fid [binary format S [expr {...}]]
puts $fid [binary format S1 [list [expr {...}]]]
puts $fid [binary format S2 [list [expr {...}] [expr {...}]]]RJM replies: thanks for pointing this out. Normally I don't use list when I'm sure that the elements contain no white spaces (readability...). But a short investigation showed me, that using list instead of ".."-grouping here executes faster! Apparently, a conversion from string to list is saved when a pure list is used. I also found another interesting page in the wiki concerning strings vs. lists. When I find it, I'll add a link here.Another note: binary format S indeed executes faster than binary format S1. But still outputting an expression result to a file (ascii string) is faster than outputting the binary representation of the expr result via binary format, also when I use the "I" or "i" option (exact 32 bit native binary representation).Tcl syntax help - Category Command - Category Binary Data - Category String Processing
