binary.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:25k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1997 by Sun Microsystems, Inc.
  3. '"
  4. '" See the file "license.terms" for information on usage and redistribution
  5. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  6. '" 
  7. '" RCS: @(#) $Id: binary.n,v 1.11.2.8 2005/02/10 10:28:21 dkf Exp $
  8. '" 
  9. .so man.macros
  10. .TH binary n 8.0 Tcl "Tcl Built-In Commands"
  11. .BS
  12. '" Note:  do not modify the .SH NAME line immediately below!
  13. .SH NAME
  14. binary - Insert and extract fields from binary strings
  15. .SH SYNOPSIS
  16. fBbinary format fIformatString fR?fIarg arg ...fR?
  17. .br
  18. fBbinary scan fIstring formatString fR?fIvarName varName ...fR?
  19. .BE
  20. .SH DESCRIPTION
  21. .PP
  22. This command provides facilities for manipulating binary data.  The
  23. first form, fBbinary formatfR, creates a binary string from normal
  24. Tcl values.  For example, given the values 16 and 22, on a 32 bit
  25. architecture, it might produce an 8-byte binary string consisting of
  26. two 4-byte integers, one for each of the numbers.  The second form of
  27. the command, fBbinary scanfR, does the opposite: it extracts data
  28. from a binary string and returns it as ordinary Tcl string values.
  29. .SH "BINARY FORMAT"
  30. .PP
  31. The fBbinary formatfR command generates a binary string whose layout
  32. is specified by the fIformatStringfR and whose contents come from
  33. the additional arguments.  The resulting binary value is returned.
  34. .PP
  35. The fIformatStringfR consists of a sequence of zero or more field
  36. specifiers separated by zero or more spaces.  Each field specifier is
  37. a single type character followed by an optional numeric fIcountfR.
  38. Most field specifiers consume one argument to obtain the value to be
  39. formatted.  The type character specifies how the value is to be
  40. formatted.  The fIcountfR typically indicates how many items of the
  41. specified type are taken from the value.  If present, the fIcountfR
  42. is a non-negative decimal integer or fB*fR, which normally indicates
  43. that all of the items in the value are to be used.  If the number of
  44. arguments does not match the number of fields in the format string
  45. that consume arguments, then an error is generated.
  46. .PP
  47. Here is a small example to clarify the relation between the field
  48. specifiers and the arguments:
  49. .CS
  50. fBbinary format d3d {1.0 2.0 3.0 4.0} 0.1fR
  51. .CE
  52. .PP
  53. The first argument is a list of four numbers, but because of the count
  54. of 3 for the associated field specifier, only the first three will be
  55. used. The second argument is associated with the second field
  56. specifier. The resulting binary string contains the four numbers 1.0,
  57. 2.0, 3.0 and 0.1.
  58. .PP
  59. Each type-count pair moves an imaginary cursor through the binary
  60. data, storing bytes at the current position and advancing the cursor
  61. to just after the last byte stored.  The cursor is initially at
  62. position 0 at the beginning of the data.  The type may be any one of
  63. the following characters:
  64. .IP fBafR 5
  65. Stores a character string of length fIcountfR in the output string.
  66. Every character is taken as modulo 256 (i.e. the low byte of every
  67. character is used, and the high byte discarded) so when storing
  68. character strings not wholly expressible using the characters \u0000-\u00ff,
  69. the fBencoding converttofR command should be used
  70. first if this truncation is not desired (i.e. if the characters are
  71. not part of the ISO 8859-1 character set.)
  72. If fIargfR has fewer than fIcountfR bytes, then additional zero
  73. bytes are used to pad out the field.  If fIargfR is longer than the
  74. specified length, the extra characters will be ignored.  If
  75. fIcountfR is fB*fR, then all of the bytes in fIargfR will be
  76. formatted.  If fIcountfR is omitted, then one character will be
  77. formatted.  For example,
  78. .RS
  79. .CS
  80. fBbinary format a7a*a alpha bravo charliefR
  81. .CE
  82. will return a string equivalent to fBalpha\000\000bravocfR.
  83. .RE
  84. .IP fBAfR 5
  85. This form is the same as fBafR except that spaces are used for
  86. padding instead of nulls.  For example,
  87. .RS
  88. .CS
  89. fBbinary format A6A*A alpha bravo charliefR
  90. .CE
  91. will return fBalpha bravocfR.
  92. .RE
  93. .IP fBbfR 5
  94. Stores a string of fIcountfR binary digits in low-to-high order
  95. within each byte in the output string.  fIArgfR must contain a
  96. sequence of fB1fR and fB0fR characters.  The resulting bytes are
  97. emitted in first to last order with the bits being formatted in
  98. low-to-high order within each byte.  If fIargfR has fewer than
  99. fIcountfR digits, then zeros will be used for the remaining bits.
  100. If fIargfR has more than the specified number of digits, the extra
  101. digits will be ignored.  If fIcountfR is fB*fR, then all of the
  102. digits in fIargfR will be formatted.  If fIcountfR is omitted,
  103. then one digit will be formatted.  If the number of bits formatted
  104. does not end at a byte boundary, the remaining bits of the last byte
  105. will be zeros.  For example,
  106. .RS
  107. .CS
  108. fBbinary format b5b* 11100 111000011010fR
  109. .CE
  110. will return a string equivalent to fB\x07\x87\x05fR.
  111. .RE
  112. .IP fBBfR 5
  113. This form is the same as fBbfR except that the bits are stored in
  114. high-to-low order within each byte.  For example,
  115. .RS
  116. .CS
  117. fBbinary format B5B* 11100 111000011010fR
  118. .CE
  119. will return a string equivalent to fB\xe0\xe1\xa0fR.
  120. .RE
  121. .IP fBhfR 5
  122. Stores a string of fIcountfR hexadecimal digits in low-to-high
  123. within each byte in the output string.  fIArgfR must contain a
  124. sequence of characters in the set ``0123456789abcdefABCDEF''.  The
  125. resulting bytes are emitted in first to last order with the hex digits
  126. being formatted in low-to-high order within each byte.  If fIargfR
  127. has fewer than fIcountfR digits, then zeros will be used for the
  128. remaining digits.  If fIargfR has more than the specified number of
  129. digits, the extra digits will be ignored.  If fIcountfR is
  130. fB*fR, then all of the digits in fIargfR will be formatted.  If
  131. fIcountfR is omitted, then one digit will be formatted.  If the
  132. number of digits formatted does not end at a byte boundary, the
  133. remaining bits of the last byte will be zeros.  For example,
  134. .RS
  135. .CS
  136. fBbinary format h3h* AB deffR
  137. .CE
  138. will return a string equivalent to fB\xba\x00\xed\x0ffR.
  139. .RE
  140. .IP fBHfR 5
  141. This form is the same as fBhfR except that the digits are stored in
  142. high-to-low order within each byte.  For example,
  143. .RS
  144. .CS
  145. fBbinary format H3H* ab DEFfR
  146. .CE
  147. will return a string equivalent to fB\xab\x00\xde\xf0fR.
  148. .RE
  149. .IP fBcfR 5
  150. Stores one or more 8-bit integer values in the output string.  If no
  151. fIcountfR is specified, then fIargfR must consist of an integer
  152. value; otherwise fIargfR must consist of a list containing at least
  153. fIcountfR integer elements.  The low-order 8 bits of each integer
  154. are stored as a one-byte value at the cursor position.  If fIcountfR
  155. is fB*fR, then all of the integers in the list are formatted.  If
  156. the number of elements in the list is fewer than fIcountfR, then an
  157. error is generated.  If the number of elements in the list is greater
  158. than fIcountfR, then the extra elements are ignored.  For example,
  159. .RS
  160. .CS
  161. fBbinary format c3cc* {3 -3 128 1} 260 {2 5}fR
  162. .CE
  163. will return a string equivalent to
  164. fB\x03\xfd\x80\x04\x02\x05fR, whereas
  165. .CS
  166. fBbinary format c {2 5}fR
  167. .CE
  168. will generate an error.
  169. .RE
  170. .IP fBsfR 5
  171. This form is the same as fBcfR except that it stores one or more
  172. 16-bit integers in little-endian byte order in the output string.  The
  173. low-order 16-bits of each integer are stored as a two-byte value at
  174. the cursor position with the least significant byte stored first.  For
  175. example,
  176. .RS
  177. .CS
  178. fBbinary format s3 {3 -3 258 1}fR
  179. .CE
  180. will return a string equivalent to 
  181. fB\x03\x00\xfd\xff\x02\x01fR.
  182. .RE
  183. .IP fBSfR 5
  184. This form is the same as fBsfR except that it stores one or more
  185. 16-bit integers in big-endian byte order in the output string.  For
  186. example,
  187. .RS
  188. .CS
  189. fBbinary format S3 {3 -3 258 1}fR
  190. .CE
  191. will return a string equivalent to 
  192. fB\x00\x03\xff\xfd\x01\x02fR.
  193. .RE
  194. .IP fBifR 5
  195. This form is the same as fBcfR except that it stores one or more
  196. 32-bit integers in little-endian byte order in the output string.  The
  197. low-order 32-bits of each integer are stored as a four-byte value at
  198. the cursor position with the least significant byte stored first.  For
  199. example,
  200. .RS
  201. .CS
  202. fBbinary format i3 {3 -3 65536 1}fR
  203. .CE
  204. will return a string equivalent to 
  205. fB\x03\x00\x00\x00\xfd\xff\xff\xff\x00\x00\x01\x00fR
  206. .RE
  207. .IP fBIfR 5
  208. This form is the same as fBifR except that it stores one or more one
  209. or more 32-bit integers in big-endian byte order in the output string.
  210. For example,
  211. .RS
  212. .CS
  213. fBbinary format I3 {3 -3 65536 1}fR
  214. .CE
  215. will return a string equivalent to 
  216. fB\x00\x00\x00\x03\xff\xff\xff\xfd\x00\x01\x00\x00fR
  217. .RE
  218. .IP fBwfR 5
  219. .VS 8.4
  220. This form is the same as fBcfR except that it stores one or more
  221. 64-bit integers in little-endian byte order in the output string.  The
  222. low-order 64-bits of each integer are stored as an eight-byte value at
  223. the cursor position with the least significant byte stored first.  For
  224. example,
  225. .RS
  226. .CS
  227. fBbinary format w 7810179016327718216fR
  228. .CE
  229. will return the string fBHelloTclfR
  230. .RE
  231. .IP fBWfR 5
  232. This form is the same as fBwfR except that it stores one or more one
  233. or more 64-bit integers in big-endian byte order in the output string.
  234. For example,
  235. .RS
  236. .CS
  237. fBbinary format Wc 4785469626960341345 110fR
  238. .CE
  239. will return the string fBBigEndianfR
  240. .VE
  241. .RE
  242. .IP fBffR 5
  243. This form is the same as fBcfR except that it stores one or more one
  244. or more single-precision floating in the machine's native
  245. representation in the output string.  This representation is not
  246. portable across architectures, so it should not be used to communicate
  247. floating point numbers across the network.  The size of a floating
  248. point number may vary across architectures, so the number of bytes
  249. that are generated may vary.  If the value overflows the
  250. machine's native representation, then the value of FLT_MAX
  251. as defined by the system will be used instead.  Because Tcl uses
  252. double-precision floating-point numbers internally, there may be some
  253. loss of precision in the conversion to single-precision.  For example,
  254. on a Windows system running on an Intel Pentium processor,
  255. .RS
  256. .CS
  257. fBbinary format f2 {1.6 3.4}fR
  258. .CE
  259. will return a string equivalent to 
  260. fB\xcd\xcc\xcc\x3f\x9a\x99\x59\x40fR.
  261. .RE
  262. .IP fBdfR 5
  263. This form is the same as fBffR except that it stores one or more one
  264. or more double-precision floating in the machine's native
  265. representation in the output string.  For example, on a
  266. Windows system running on an Intel Pentium processor,
  267. .RS
  268. .CS
  269. fBbinary format d1 {1.6}fR
  270. .CE
  271. will return a string equivalent to 
  272. fB\x9a\x99\x99\x99\x99\x99\xf9\x3ffR.
  273. .RE
  274. .IP fBxfR 5
  275. Stores fIcountfR null bytes in the output string.  If fIcountfR is
  276. not specified, stores one null byte.  If fIcountfR is fB*fR,
  277. generates an error.  This type does not consume an argument.  For
  278. example,
  279. .RS
  280. .CS
  281. fBbinary format a3xa3x2a3 abc def ghifR
  282. .CE
  283. will return a string equivalent to fBabc\000def\000\000ghifR.
  284. .RE
  285. .IP fBXfR 5
  286. Moves the cursor back fIcountfR bytes in the output string.  If
  287. fIcountfR is fB*fR or is larger than the current cursor position,
  288. then the cursor is positioned at location 0 so that the next byte
  289. stored will be the first byte in the result string.  If fIcountfR is
  290. omitted then the cursor is moved back one byte.  This type does not
  291. consume an argument.  For example,
  292. .RS
  293. .CS
  294. fBbinary format a3X*a3X2a3 abc def ghifR
  295. .CE
  296. will return fBdghifR.
  297. .RE
  298. .IP fB@fR 5
  299. Moves the cursor to the absolute location in the output string
  300. specified by fIcountfR.  Position 0 refers to the first byte in the
  301. output string.  If fIcountfR refers to a position beyond the last
  302. byte stored so far, then null bytes will be placed in the uninitialized
  303. locations and the cursor will be placed at the specified location.  If
  304. fIcountfR is fB*fR, then the cursor is moved to the current end of
  305. the output string.  If fIcountfR is omitted, then an error will be
  306. generated.  This type does not consume an argument. For example,
  307. .RS
  308. .CS
  309. fBbinary format a5@2a1@*a3@10a1 abcde f ghi jfR
  310. .CE
  311. will return fBabfdeghi\000\000jfR.
  312. .RE
  313. .SH "BINARY SCAN"
  314. .PP
  315. The fBbinary scanfR command parses fields from a binary string,
  316. returning the number of conversions performed.  fIStringfR gives the
  317. input to be parsed and fIformatStringfR indicates how to parse it.
  318. Each fIvarNamefR gives the name of a variable; when a field is
  319. scanned from fIstringfR the result is assigned to the corresponding
  320. variable.
  321. .PP
  322. As with fBbinary formatfR, the fIformatStringfR consists of a
  323. sequence of zero or more field specifiers separated by zero or more
  324. spaces.  Each field specifier is a single type character followed by
  325. an optional numeric fIcountfR.  Most field specifiers consume one
  326. argument to obtain the variable into which the scanned values should
  327. be placed.  The type character specifies how the binary data is to be
  328. interpreted.  The fIcountfR typically indicates how many items of
  329. the specified type are taken from the data.  If present, the
  330. fIcountfR is a non-negative decimal integer or fB*fR, which
  331. normally indicates that all of the remaining items in the data are to
  332. be used.  If there are not enough bytes left after the current cursor
  333. position to satisfy the current field specifier, then the
  334. corresponding variable is left untouched and fBbinary scanfR returns
  335. immediately with the number of variables that were set.  If there are
  336. not enough arguments for all of the fields in the format string that
  337. consume arguments, then an error is generated.
  338. .PP
  339. A similar example as with fBbinary formatfR should explain the
  340. relation between field specifiers and arguments in case of the binary
  341. scan subcommand:
  342. .CS
  343. fBbinary scan $bytes s3s first secondfR
  344. .CE
  345. .PP
  346. This command (provided the binary string in the variable fIbytesfR
  347. is long enough) assigns a list of three integers to the variable
  348. fIfirstfR and assigns a single value to the variable fIsecondfR.
  349. If fIbytesfR contains fewer than 8 bytes (i.e. four 2-byte
  350. integers), no assignment to fIsecondfR will be made, and if
  351. fIbytesfR contains fewer than 6 bytes (i.e. three 2-byte integers),
  352. no assignment to fIfirstfR will be made.  Hence:
  353. .CS
  354. fBputs [binary scan abcdefg s3s first second]fR
  355. fBputs $firstfR
  356. fBputs $secondfR
  357. .CE
  358. will print (assuming neither variable is set previously):
  359. .CS
  360. fB1fR
  361. fB25185 25699 26213fR
  362. fIcan't read "second": no such variablefR
  363. .CE
  364. .PP
  365. It is fBimportantfR to note that the fBcfR, fBsfR, and fBSfR
  366. (and fBifR and fBIfR on 64bit systems) will be scanned into
  367. long data size values.  In doing this, values that have their high
  368. bit set (0x80 for chars, 0x8000 for shorts, 0x80000000 for ints),
  369. will be sign extended.  Thus the following will occur:
  370. .CS
  371. fBset signShort [binary format s1 0x8000]fR
  372. fBbinary scan $signShort s1 val; fI# val == 0xFFFF8000fR
  373. .CE
  374. If you want to produce an unsigned value, then you can mask the return 
  375. value to the desired size.  For example, to produce an unsigned short 
  376. value:
  377. .CS
  378. fBset val [expr {$val & 0xFFFF}]; fI# val == 0x8000fR
  379. .CE
  380. .PP
  381. Each type-count pair moves an imaginary cursor through the binary data,
  382. reading bytes from the current position.  The cursor is initially
  383. at position 0 at the beginning of the data.  The type may be any one of
  384. the following characters:
  385. .IP fBafR 5
  386. The data is a character string of length fIcountfR.  If fIcountfR
  387. is fB*fR, then all of the remaining bytes in fIstringfR will be
  388. scanned into the variable.  If fIcountfR is omitted, then one
  389. character will be scanned.
  390. All characters scanned will be interpreted as being in the
  391. range \u0000-\u00ff so the fBencoding convertfromfR command might be
  392. needed if the string is not an ISO 8859-1 string.
  393. For example,
  394. .RS
  395. .CS
  396. fBbinary scan abcde\000fghi a6a10 var1 var2fR
  397. .CE
  398. will return fB1fR with the string equivalent to fBabcde\000fR
  399. stored in fBvar1fR and fBvar2fR left unmodified.
  400. .RE
  401. .IP fBAfR 5
  402. This form is the same as fBafR, except trailing blanks and nulls are stripped from
  403. the scanned value before it is stored in the variable.  For example,
  404. .RS
  405. .CS
  406. fBbinary scan "abc efghi  \000" A* var1fR
  407. .CE
  408. will return fB1fR with fBabc efghifR stored in fBvar1fR.
  409. .RE
  410. .IP fBbfR 5
  411. The data is turned into a string of fIcountfR binary digits in
  412. low-to-high order represented as a sequence of ``1'' and ``0''
  413. characters.  The data bytes are scanned in first to last order with
  414. the bits being taken in low-to-high order within each byte.  Any extra
  415. bits in the last byte are ignored.  If fIcountfR is fB*fR, then
  416. all of the remaining bits in fBstringfR will be scanned.  If
  417. fIcountfR is omitted, then one bit will be scanned.  For example,
  418. .RS
  419. .CS
  420. fBbinary scan \x07\x87\x05 b5b* var1 var2fR
  421. .CE
  422. will return fB2fR with fB11100fR stored in fBvar1fR and
  423. fB1110000110100000fR stored in fBvar2fR.
  424. .RE
  425. .IP fBBfR 5
  426. This form is the same as fBbfR, except the bits are taken in
  427. high-to-low order within each byte.  For example,
  428. .RS
  429. .CS
  430. fBbinary scan \x70\x87\x05 B5B* var1 var2fR
  431. .CE
  432. will return fB2fR with fB01110fR stored in fBvar1fR and
  433. fB1000011100000101fR stored in fBvar2fR.
  434. .RE
  435. .IP fBhfR 5
  436. The data is turned into a string of fIcountfR hexadecimal digits in
  437. low-to-high order represented as a sequence of characters in the set
  438. ``0123456789abcdef''.  The data bytes are scanned in first to last
  439. order with the hex digits being taken in low-to-high order within each
  440. byte.  Any extra bits in the last byte are ignored.  If fIcountfR
  441. is fB*fR, then all of the remaining hex digits in fBstringfR will be
  442. scanned.  If fIcountfR is omitted, then one hex digit will be
  443. scanned.  For example,
  444. .RS
  445. .CS
  446. fBbinary scan \x07\x86\x05 h3h* var1 var2fR
  447. .CE
  448. will return fB2fR with fB706fR stored in fBvar1fR and
  449. fB50fR stored in fBvar2fR.
  450. .RE
  451. .IP fBHfR 5
  452. This form is the same as fBhfR, except the digits are taken in
  453. high-to-low order within each byte.  For example,
  454. .RS
  455. .CS
  456. fBbinary scan \x07\x86\x05 H3H* var1 var2fR
  457. .CE
  458. will return fB2fR with fB078fR stored in fBvar1fR and
  459. fB05fR stored in fBvar2fR.
  460. .RE
  461. .IP fBcfR 5
  462. The data is turned into fIcountfR 8-bit signed integers and stored
  463. in the corresponding variable as a list. If fIcountfR is fB*fR,
  464. then all of the remaining bytes in fBstringfR will be scanned.  If
  465. fIcountfR is omitted, then one 8-bit integer will be scanned.  For
  466. example,
  467. .RS
  468. .CS
  469. fBbinary scan \x07\x86\x05 c2c* var1 var2fR
  470. .CE
  471. will return fB2fR with fB7 -122fR stored in fBvar1fR and fB5fR
  472. stored in fBvar2fR.  Note that the integers returned are signed, but
  473. they can be converted to unsigned 8-bit quantities using an expression
  474. like:
  475. .CS
  476. fBexpr { $num & 0xff }fR
  477. .CE
  478. .RE
  479. .IP fBsfR 5
  480. The data is interpreted as fIcountfR 16-bit signed integers
  481. represented in little-endian byte order.  The integers are stored in
  482. the corresponding variable as a list.  If fIcountfR is fB*fR, then
  483. all of the remaining bytes in fBstringfR will be scanned.  If
  484. fIcountfR is omitted, then one 16-bit integer will be scanned.  For
  485. example,
  486. .RS
  487. .CS
  488. fBbinary scan \x05\x00\x07\x00\xf0\xff s2s* var1 var2fR
  489. .CE
  490. will return fB2fR with fB5 7fR stored in fBvar1fR and fB-16fR
  491. stored in fBvar2fR.  Note that the integers returned are signed, but
  492. they can be converted to unsigned 16-bit quantities using an expression
  493. like:
  494. .CS
  495. fBexpr { $num & 0xffff }fR
  496. .CE
  497. .RE
  498. .IP fBSfR 5
  499. This form is the same as fBsfR except that the data is interpreted
  500. as fIcountfR 16-bit signed integers represented in big-endian byte
  501. order.  For example,
  502. .RS
  503. .CS
  504. fBbinary scan \x00\x05\x00\x07\xff\xf0 S2S* var1 var2fR
  505. .CE
  506. will return fB2fR with fB5 7fR stored in fBvar1fR and fB-16fR
  507. stored in fBvar2fR. 
  508. .RE
  509. .IP fBifR 5
  510. The data is interpreted as fIcountfR 32-bit signed integers
  511. represented in little-endian byte order.  The integers are stored in
  512. the corresponding variable as a list.  If fIcountfR is fB*fR, then
  513. all of the remaining bytes in fBstringfR will be scanned.  If
  514. fIcountfR is omitted, then one 32-bit integer will be scanned.  For
  515. example,
  516. .RS
  517. .CS
  518. fBbinary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff i2i* var1 var2fR
  519. .CE
  520. will return fB2fR with fB5 7fR stored in fBvar1fR and fB-16fR
  521. stored in fBvar2fR.  Note that the integers returned are signed, but
  522. they can be converted to unsigned 32-bit quantities using an expression
  523. like:
  524. .CS
  525. fBexpr { $num & 0xffffffff }fR
  526. .CE
  527. .RE
  528. .IP fBIfR 5
  529. This form is the same as fBIfR except that the data is interpreted
  530. as fIcountfR 32-bit signed integers represented in big-endian byte
  531. order.  For example,
  532. .RS
  533. .CS
  534. fBbinary scan \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 I2I* var1 var2fR
  535. .CE
  536. will return fB2fR with fB5 7fR stored in fBvar1fR and fB-16fR
  537. stored in fBvar2fR.
  538. .RE
  539. .IP fBwfR 5
  540. .VS 8.4
  541. The data is interpreted as fIcountfR 64-bit signed integers
  542. represented in little-endian byte order.  The integers are stored in
  543. the corresponding variable as a list.  If fIcountfR is fB*fR, then
  544. all of the remaining bytes in fBstringfR will be scanned.  If
  545. fIcountfR is omitted, then one 64-bit integer will be scanned.  For
  546. example,
  547. .RS
  548. .CS
  549. fBbinary scan \x05\x00\x00\x00\x07\x00\x00\x00\xf0\xff\xff\xff wi* var1 var2fR
  550. .CE
  551. will return fB2fR with fB30064771077fR stored in fBvar1fR and
  552. fB-16fR stored in fBvar2fR.  Note that the integers returned are
  553. signed and cannot be represented by Tcl as unsigned values.
  554. .RE
  555. .IP fBWfR 5
  556. This form is the same as fBwfR except that the data is interpreted
  557. as fIcountfR 64-bit signed integers represented in big-endian byte
  558. order.  For example,
  559. .RS
  560. .CS
  561. fBbinary scan \x00\x00\x00\x05\x00\x00\x00\x07\xff\xff\xff\xf0 WI* var1 var2fR
  562. .CE
  563. will return fB2fR with fB21474836487fR stored in fBvar1fR and fB-16fR
  564. stored in fBvar2fR.
  565. .VE
  566. .RE
  567. .IP fBffR 5
  568. The data is interpreted as fIcountfR single-precision floating point
  569. numbers in the machine's native representation.  The floating point
  570. numbers are stored in the corresponding variable as a list.  If
  571. fIcountfR is fB*fR, then all of the remaining bytes in
  572. fBstringfR will be scanned.  If fIcountfR is omitted, then one
  573. single-precision floating point number will be scanned.  The size of a
  574. floating point number may vary across architectures, so the number of
  575. bytes that are scanned may vary.  If the data does not represent a
  576. valid floating point number, the resulting value is undefined and
  577. compiler dependent.  For example, on a Windows system running on an
  578. Intel Pentium processor,
  579. .RS
  580. .CS
  581. fBbinary scan \x3f\xcc\xcc\xcd f var1fR
  582. .CE
  583. will return fB1fR with fB1.6000000238418579fR stored in
  584. fBvar1fR.
  585. .RE
  586. .IP fBdfR 5
  587. This form is the same as fBffR except that the data is interpreted
  588. as fIcountfR double-precision floating point numbers in the
  589. machine's native representation. For example, on a Windows system
  590. running on an Intel Pentium processor,
  591. .RS
  592. .CS
  593. fBbinary scan \x9a\x99\x99\x99\x99\x99\xf9\x3f d var1fR
  594. .CE
  595. will return fB1fR with fB1.6000000000000001fR
  596. stored in fBvar1fR.
  597. .RE
  598. .IP fBxfR 5
  599. Moves the cursor forward fIcountfR bytes in fIstringfR.  If
  600. fIcountfR is fB*fR or is larger than the number of bytes after the
  601. current cursor cursor position, then the cursor is positioned after
  602. the last byte in fIstringfR.  If fIcountfR is omitted, then the
  603. cursor is moved forward one byte.  Note that this type does not
  604. consume an argument.  For example,
  605. .RS
  606. .CS
  607. fBbinary scan \x01\x02\x03\x04 x2H* var1fR
  608. .CE
  609. will return fB1fR with fB0304fR stored in fBvar1fR.
  610. .RE
  611. .IP fBXfR 5
  612. Moves the cursor back fIcountfR bytes in fIstringfR.  If
  613. fIcountfR is fB*fR or is larger than the current cursor position,
  614. then the cursor is positioned at location 0 so that the next byte
  615. scanned will be the first byte in fIstringfR.  If fIcountfR
  616. is omitted then the cursor is moved back one byte.  Note that this
  617. type does not consume an argument.  For example,
  618. .RS
  619. .CS
  620. fBbinary scan \x01\x02\x03\x04 c2XH* var1 var2fR
  621. .CE
  622. will return fB2fR with fB1 2fR stored in fBvar1fR and fB020304fR
  623. stored in fBvar2fR.
  624. .RE
  625. .IP fB@fR 5
  626. Moves the cursor to the absolute location in the data string specified
  627. by fIcountfR.  Note that position 0 refers to the first byte in
  628. fIstringfR.  If fIcountfR refers to a position beyond the end of
  629. fIstringfR, then the cursor is positioned after the last byte.  If
  630. fIcountfR is omitted, then an error will be generated.  For example,
  631. .RS
  632. .CS
  633. fBbinary scan \x01\x02\x03\x04 c2@1H* var1 var2fR
  634. .CE
  635. will return fB2fR with fB1 2fR stored in fBvar1fR and fB020304fR
  636. stored in fBvar2fR.
  637. .RE
  638. .SH "PLATFORM ISSUES"
  639. Sometimes it is desirable to format or scan integer values in the
  640. native byte order for the machine.  Refer to the fBbyteOrderfR
  641. element of the fBtcl_platformfR array to decide which type character
  642. to use when formatting or scanning integers.
  643. .SH EXAMPLES
  644. This is a procedure to write a Tcl string to a binary-encoded channel as
  645. UTF-8 data preceded by a length word:
  646. .CS
  647. proc writeString {channel string} {
  648.     set data [encoding convertto utf-8 $string]
  649.     puts -nonewline [fBbinary formatfR Ia* e
  650.             [string length $data] $data]
  651. }
  652. .CE
  653. .PP
  654. This procedure reads a string from a channel that was written by the
  655. previously presented fBwriteStringfR procedure:
  656. .CS
  657. proc readString {channel} {
  658.     if {![fBbinary scanfR [read $channel 4] I length]} {
  659.         error "missing length"
  660.     }
  661.     set data [read $channel $length]
  662.     return [encoding convertfrom utf-8 $data]
  663. }
  664. .CE
  665. .SH "SEE ALSO"
  666. format(n), scan(n), tclvars(n)
  667. .SH KEYWORDS
  668. binary, format, scan