source: trunk/SRC/ToBeReviewed/LECTURE/binary.pro

Last change on this file was 371, checked in by pinsard, 16 years ago

improvements of headers (alignments of IDL prompt in examples)

  • Property svn:keywords set to Id
File size: 3.8 KB
Line 
1;+
2;
3; @file_comments
4; Returns the binary representation of a number of any numerical type.
5;
6; @param NUMBER {in}{required}
7; scalar or array of numbers (any numerical type)
8;
9; @returns
10; Byte array with binary representation of numbers.
11;
12; @examples
13;
14;   Binary representation of 11b:
15;   IDL> print, binary(11b)
16;     0 0 0 0 1 0 1 1
17;
18;   Binary representation of pi (x86: Little-endian IEEE representation):
19;   IDL> print, format='(z9.8,5x,4(1x,8i1))', long(!pi,0), binary(!pi)
20;      40490fdb      01000000 01001001 00001111 11011011 (x86 Linux)
21;      0fdb4149      00001111 11011011 01000001 01001001 (Alpha OpenVMS)
22;   IDL> print, format='(8(1x,8i0))', binary(!dpi)
23;      01000000 00001001 00100001 11111011 01010100 01000100 00101101 00011000
24;
25;   Some first tests before type double was added:
26;   IDL> print, format='(2a6,4x,2z9.8,4x,8z3.2)', $
27;       !version.arch, !version.os, long(!dpi,0,2), byte(!dpi,0,8)
28;       x86 linux     54442d18 400921fb     18 2d 44 54 fb 21 09 40
29;     sparc sunos     400921fb 54442d18     40 09 21 fb 54 44 2d 18
30;     alpha   vms     0fda4149 68c0a221     49 41 da 0f 21 a2 c0 68
31;     (Beginning with IDL 5.1, Alpha VMS uses IEEE representation as well.)
32;
33; @history
34;    19 Dec 1997  Originally a news posting by David Fanning.
35;                       (Re: bits from bytes)
36;    20 Dec 1997  "Complete" rewrite: eliminate loops.
37;    22 Dec 1997  Bit shift instead of exponentiation, return byte
38;      array, handle input arrays.
39;      Think about double and complex types.
40;    22 Sep 1998  Complete rewrite: reduce every numerical type to
41;      single bytes. Check that big and little endian machines
42;      return exactly the same results (if IEEE).
43;    7 May 2003     Added newish data types, unsigned and long64.  BT
44;
45; @version
46; $Id$
47;
48;-
49FUNCTION binary, number
50;
51  compile_opt idl2, strictarrsubs
52;
53  s = size(number)
54  type = s[s[0] + 1]
55  n_no = s[s[0] + 2]
56; Numerical types: (will have to be completed if IDL adds double-long, ...)
57; 1: byte             (1-byte unsigned integer)
58; 2: integer          (2-byte   signed integer)
59; 3: long             (4-byte   signed integer)
60; 4: floating-point   (4-byte, single precision)
61; 5: double-precision (8-byte, double precision)
62; 6: complex        (2x4-byte, single precision)
63; 9: double-complex (2x8-byte, double precision)
64; 12: uInt      (2-byte, unsigned integer)
65; 13: uLong     (4-byte, unsigned integer)
66; 14: Long64       (8-byte, signed integer)
67; 15: uLong64      (8-byte, unsigned integer)
68; Non-numerical types:
69; 0: undefined, 7: string, 8: structure, 10: pointer, 11: object reference
70;  nbyt = [0, 1, 2, 4, 4, 8, 8, 0, 0, 16, 0, 0] ; number of bytes per type
71; code = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
72  nbyt = [0, 1, 2, 4, 4, 8, 8, 0, 0, 16, 0, 0,  2,  4,  8,  8]
73  ntyp = nbyt[type]
74  if ntyp eq 0 then message, 'Invalid argument (must be numerical type).'
75  bits = [128, 64, 32, 16,  8,  4,  2,  1] ; = ishft(1b, 7-indgen(8))
76; For correct array handling and byte comparison, 'number' and 'bits' require
77; same dimensions -> numvalue and bitvalue
78  bitvalue = ((bits)[*, intarr(ntyp)])[*, *, intarr(n_no)]
79  little_endian = (byte(1, 0, 1))[0]
80; In case of complex type and little endian machine, swap the two float values
81; before the complete second dimension is reversed at returning.
82  if (type eq 6 or type eq 9) and little_endian then $ ; type complex
83    numvalue = reform((byte([number], 0, 1, ntyp/2, 2, n_no))$
84                      [intarr(8), *, [1,0], *], 8, ntyp, n_no) $
85  else numvalue = (byte([number], 0, 1, ntyp, n_no))[intarr(8), *, *]
86; On little endian machines, the second dimension of the return value must
87; be reversed.
88  if little_endian AND type NE 1 then $
89    return, reverse((numvalue and bitvalue) ne 0, 2) else $
90    return,         (numvalue and bitvalue) ne 0
91end
Note: See TracBrowser for help on using the repository browser.