home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / doc / mir / 18binary < prev    next >
Text File  |  1992-06-29  |  16KB  |  345 lines

  1.               ═════════════════════════════════
  2.  
  3.                   8.   WORKED EXAMPLES...
  4.                        BINARY DATA
  5.  
  6.               ═════════════════════════════════
  7.  
  8.  
  9. ≡≡≡≡->> QUESTION:
  10.             If you have binary data that you can't decipher, and if
  11.             you are able to give permission for a sample to be
  12.             included in this topic as a worked example, then here's
  13.             an opportunity!  The first few samples received that I
  14.             feel would be useful teaching tools for other readers
  15.             will be built in, and the sender will receive a copy of
  16.             the expanded topic.
  17.                                                             <<-≡≡≡≡
  18.  
  19.  
  20.         ════════════════════════════════════
  21. 8.1           The preprocessing option
  22.         ════════════════════════════════════
  23.  
  24.             Recall that the eight bits in a byte can occur in 256
  25. combinations.  Most of the low end control characters and the 128
  26. values with the high bit set are not printable.  In a DOS file,
  27. allowance may be made for accented characters and, in some cases,
  28. for mathematical and Greek symbols.  In topic 4 we looked at
  29. reasons why the non-printable characters might occur in a file...
  30. packed numbers, binary markup, compression substitutions, etc.  To
  31. this list we may add data that is truly binary... numeric values
  32. occupying one, two or four bytes, or so-called "real" numbers with
  33. values before and after a decimal place.  Alternatively, files may
  34. contain data that are not intended for display on ASCII screens at
  35. all... audio, graphics, animation, etc.
  36.  
  37.             It would be technically possible to index some types of
  38. binary data directly, provided the software were written to take
  39. into account every form of data which might be presented for
  40. indexing.  The problem with specialized software is that disaster
  41. lurks one thoughtless command away.  Sooner or later somebody is
  42. going to feed in data with peculiarities not foreseen by the
  43. programmer.  In computer parlance, the "results are unpredictable." 
  44. Specialized software requires specialized data.
  45.  
  46.             For most purposes, it is preferable to use a single
  47. general indexing program.  Indexing at its core is a process of
  48. inverting a huge matrix.  That's fairly complex and has to be made
  49. as efficient as possible.  (We go into all the details in Tutorial
  50. THREE.)  We don't want to load that software down with complex
  51. parsing.  It's better to do any specialized work separately.  Hence
  52. we add a step called "preprocessing" to bring data to a standard
  53. ASCII format.  The following steps are applied, first to a sample,
  54. later to the full set of data:
  55.  
  56.         »   Analyze data
  57.  
  58.         »   Select or create preprocessing tools
  59.  
  60.         »   Preprocess
  61.  
  62.         »   Verify preprocessed data is to standard
  63.  
  64.         »   Invert
  65.  
  66.         »   Validate that indexes fulfil specifications
  67.  
  68.         »   Set parameters, select display software
  69.  
  70.         »   Finalize data
  71.  
  72.         »   Test indexing and retrieval result
  73.  
  74.             We raise the subject of preprocessing now to show that
  75. all binary data has to be transformed prior to indexing.  (This is
  76. independent of how the data is made available to the searcher, in
  77. its original form or preprocessed or otherwise modified.)  Packed
  78. numbers must be unpacked, numeric fields changed to their ASCII
  79. equivalent, blocking data used to extract ASCII, markup used to
  80. identify records and their parts, compressed data uncompressed,
  81. etc.
  82.  
  83.  
  84.         ═══════════════════════════
  85. 8.2           File signatures
  86.         ═══════════════════════════
  87.  
  88.             Okay, you have some data to index and a byte survey
  89. shows that it contains non-printing characters.  Where to from
  90. here?
  91.  
  92.             All data is created through the use of some form of
  93. software... Optical Character Recognition, word processing, report
  94. generators, transaction processing, and many other forms.  Data
  95. that is not printable text often is identified internally so that
  96. its parent software will recognize the file if an attempt is made
  97. to process it.  The signature is often within the first four bytes
  98. of a file.  If not, the first 128 bytes usually contain important
  99. clues.  Recall that to display the first 128 bytes, the command
  100.  
  101.                 DUMP filename 0 128
  102.  
  103. puts the data on the screen in Hexadecimal and ASCII format. 
  104. Examples:
  105.  
  106.         »   WordPerfect files are identified in the first four
  107.             bytes by a hex value \FF followed by the letters "WPC".
  108.  
  109.         »   Microsoft Word contains many null bytes among the first
  110.             128.  Two items stand out, a style sheet name and a
  111.             printer name, such as NORMAL.STY and NECP6.
  112.  
  113.         »   DOS executable files have the signature "MZ" in the
  114.             first two bytes.  (But don't try to index their
  115.             content!)
  116.  
  117. ≡≡≡≡->> QUESTION:
  118.             Another useful item you might contribute... the first
  119.             128 bytes of various file types, to extend the list of
  120.             file "signatures".  Use CPB to make these small samples
  121.             and identify each sample by the software used to create
  122.             it.
  123.                                                             <<-≡≡≡≡
  124.  
  125.  
  126.         ════════════════════════════════════════════
  127. 8.3           Converting word processing files
  128.         ════════════════════════════════════════════
  129.  
  130.             Many word processors have an option to output ASCII
  131. files.  This option may be used to simplify preprocessing.
  132.  
  133.             The normal sequence to store a Microsoft Word file is
  134. Escape / Transfer / Save (three keystrokes \ESC T S).  If a file
  135. name has already been specified, its name is presented for
  136. confirmation.  To save the file in normal word processing mode,
  137. with its underlining, bold characters, etc., simply press return. 
  138. To convert the file to ASCII, use the same \ESC T S sequence.  You
  139. might modify the file name (for example, MYFILE.DOC to MYFILE.ASC). 
  140. Then press TAB or the right arrow.  The cursor moves to the right,
  141. past the word "formatted" and highlights Yes in a Yes / No choice. 
  142. Press N for No.  The program checks with you:  "Enter Y to confirm
  143. loss of formatting."  Press Y and the ASCII version is saved.  If
  144. you do a byte survey on the result, you should find no binary data. 
  145. There may be some work left to put the file into a standard format
  146. for indexing, but at least you are working with an ASCII file with
  147. no undefined codes.
  148.  
  149.             WordPerfect's sequence is not intuitively obvious.  But
  150. it produces a clean result.  It's CTL-F5  1  1.  You are asked to
  151. supply a file name.  Once that's in place, hit return and the ASCII
  152. version is saved.  One of the nice features of this conversion is
  153. that all tabs are replaced by blanks, and you get a WYSIWYG file
  154. that preserves all indenting and centering.  Note:  My copy of
  155. WordPerfect 5.1 includes a CONVERT.EXE utility dated 02-08-91.  The
  156. result is NOT the same.  CONVERT lapses occasionally on indents and
  157. pads the end of the ASCII output with many unnecessary hex \1A
  158. bytes.  (Incidentally, I use WordPerfect to write source code and
  159. to clean it up after debugging.  I set margins to five characters
  160. left and right, and tabs to four.  It's an easy habit to use the
  161. CTL-F5 1 1 sequence to save the file when ready to compile or tuck
  162. away for future use.)
  163.  
  164. ≡≡≡≡->> QUESTION:
  165.             Sequences for other word processors, please!
  166.                                                             <<-≡≡≡≡
  167.  
  168.  
  169.         ═════════════════════════════════════
  170. 8.4           Binary deblocking lengths
  171.         ═════════════════════════════════════
  172.  
  173.             Binary deblocking may be recognized by three features. 
  174. First, there is a low portion of binary characters in a file that
  175. is mostly printable.  Second, the binary characters occur in small
  176. bursts at slightly varying distances.  This is in contrast to the
  177. pattern with packed numbers (considered in the preceding topic) in
  178. which the non-printing characters recurred at specific points
  179. within fixed length records.   The third feature is that the binary
  180. portions translate into lengths corresponding more or less to the
  181. distance between the current and the next burst.
  182.  
  183.             This third feature is not readily apparent.  Display
  184. the data in hexadecimal and ASCII on either side of a burst.
  185.  
  186.                 DUMP filename 19200 19400
  187.  
  188. Within the result, look at the binary bytes which in this case are
  189. \03\9e (decimal equivalent = 3 X 256  + 9 X 16  +  14 X 1 = 926,
  190. provided bytes are in sequence of high to low order).
  191.  
  192. 19264: 65 6e 64 20 6f 66 20 70 72 65 76 69 6f 75 73 20
  193.                                         end of previous
  194. 19280: 62 6c 6f 63 6b 2e 03 9e 42 65 67 69 6e 6e 69 6e
  195.                                         block...Beginnin
  196. 19296: 67 20 6f 66 20 74 68 65 20 6e 65 78 74 20 62 6c
  197.                                         g of the next bl
  198.  
  199.             To test whether these are binary blocking data, do a
  200. dump 926 bytes further on and see if there are binary bytes either
  201. there or immediately adjacent.  Variations occur depending on
  202. whether the blocking data include or exclude their own length, in
  203. this case two bytes.
  204.  
  205.             You may run into cases of extended block lengths,
  206. possibly four bytes, followed by local record or sub-block lengths
  207. which are usually two bytes each.  The signal for this is four or
  208. six bytes at or near the top of the file.  It is found in some
  209. library MARC records.  In the next topic we introduce a program to
  210. deblock data in this form.
  211.  
  212.             Incidentally, the above sample is cooked data.  It's
  213. not real.  Here's a little data cooker:
  214.  
  215. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  216. Usage   hex_bin  ascii_input  binary_output
  217.  
  218.         Create a file with any combination of printable and binary
  219.         characters.  Used to create test files.
  220.  
  221. input:  An edited ASCII file in which printable characters are as
  222.         desired in output, and binary characters are represented by
  223.         a backslash and two hex values (example, \08 to represent
  224.         a backspace or \5C to represent a backslash).
  225.  
  226. output: The same file with binary characters replacing all \xx
  227.         values.
  228.  
  229. writeup: MIR TUTORIAL ONE, topic 8
  230. ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
  231.  
  232.  
  233.         ═══════════════════════════════════════════════
  234. 8.5           Binary data in fixed length records
  235.         ═══════════════════════════════════════════════
  236.  
  237.             Binary data in fixed length records can be interpreted
  238. within a reasonable time period only if you have the record layout
  239. and/or examples of printouts that match data on hand and/or the
  240. software normally used to display the data.  The more ASCII data
  241. sprinkled through the data, the easier it is to orient oneself
  242. within the record.
  243.  
  244.             Start by trying to match large integers... over 255 and
  245. if possible over 65535, that is more than one and preferably more
  246. than two bytes in length.  Select a high integer value in the
  247. display or printout.  Work out its hex equivalent.  Example:  The
  248. number 144,000 appears in the printout.
  249.  
  250.         144,000 / 65536 =   2 (hex \02), remainder = 12,928
  251.  
  252.          12,928 / 256   =  50 (hex \32), remainder =    128
  253.  
  254.             128 / 1     = 128 (hex \80).
  255.  
  256. Then look in the matching record for four bytes.  Depending on the
  257. operating system in which created, the bytes \00\02\32\80 or the
  258. reverse set \80\32\02\00 should be somewhere within the record. 
  259. For a fixed length layout, you now have identified exactly which
  260. bytes match the corresponding data.  This work is painstaking, but
  261. it enables you to define the preprocessing task very precisely.
  262.  
  263. ≡≡≡≡->> QUESTION:
  264.             Write a little routine to convert decimal values to
  265.             hexadecimal.  (UNIX has a utility BC which does exactly
  266.             this task.)
  267.                                                             <<-≡≡≡≡
  268.  
  269.             Dates are often expressed as binary values as well. 
  270. There are a variety of techniques.  Typically a base is selected. 
  271. Two bytes can hold elapsed days since the base date.  More
  272. frequently, seven bits are reserved for years since the base year,
  273. four bits for the month and five for the day of the month.  Once
  274. date bytes have been identified and matched to their corresponding
  275. display, the coding technique can be identified by inspection.
  276.  
  277.  
  278.         ═══════════════════════════
  279. 8.6           Compressed data
  280.         ═══════════════════════════
  281.  
  282.             A variety of techniques are used for compression...
  283. pattern substitution, variable length encoding, Huffman code,
  284. suppression of repeated characters, differencing, etc.  Unless
  285. information is available on how the data has been compressed, the
  286. indexer is faced with a daunting task.  Until you have built up
  287. experience in other areas of preparation and indexing, you might
  288. choose to avoid working with compressed data.
  289.  
  290.             Pattern substitution is one method that can sometimes
  291. be deciphered within a reasonable amount of time.  Repetitive
  292. strings are replaced in the text with one or two byte binary
  293. values.  These binary bytes must be distinguishable from text. If
  294. there are no accented characters (or if accented characters are
  295. preceded by a reserved character to flag them), then the high bit
  296. set characters can be used either for 128 single byte replacements
  297. or as the lead byte for 32768 two byte replacements.  In order to
  298. decompress rapidly, the display program relies on a body of text
  299. which it reads into RAM on startup.  Some programs store the
  300. decompressed equivalents in a tree format.  It's easier to work
  301. with those that employ a linear table, that is, the decompressed
  302. values listed one after another, usually with a supporting list of
  303. offsets indicating the beginning of each term.
  304.  
  305.             Pattern substitution compressed data is recognized by:
  306.  
  307.         »   high counts of non-printable characters;
  308.  
  309.         »   words and word fragments interspersed frequently within
  310.             binary values;
  311.  
  312.         »   availability of display of the uncompressed form that
  313.             matches the data being analyzed;
  314.  
  315.         »   existence of a decompression table and possibly a
  316.             vector of offsets pointing to starting points within
  317.             the table.
  318.  
  319. Once the compression technique is understood and the decompression
  320. table is available, it is possible to create software to decompress
  321. the data as a first step in preprocessing.  Because of the variety
  322. of techniques in use, it is nearly impossible to write software to
  323. cover all cases.  At a minimum, expect to spend some time adapting
  324. software; in worst case, be prepared to write from scratch.
  325.  
  326. ≡≡≡≡->> QUESTION:
  327.             The source code I have on hand is too specific to have
  328.             any teaching value.  Do you have any C code that could
  329.             serve the purpose?  Alternatively, do you have a sample
  330.             and a decompression table for which I could write the
  331.             algorithm?
  332.                                                             <<-≡≡≡≡
  333.  
  334.  
  335.                           *  *  *  *  *
  336.  
  337.             Of all data formats, binary data presents the greatest
  338. challenge to the indexer.  We have looked at reasons to preprocess
  339. binary data to a standard ASCII format.  Where possible, we use the
  340. signature of a binary file to identify the parent software and use
  341. that software to reduce the data to an ASCII alternative.  Binary
  342. blocking information and binary data within fixed length records
  343. can be fairly readily transformed to ASCII.  Compressed data is
  344. more difficult, but some forms can be preprocessed within a
  345. reasonable time frame.