|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package com.bitshift.parsing.utils;
-
- //This class contains implementations of methods to
- // -- pack an integer into 4 consecutive bytes of a byte array
- // -- unpack an integer from 4 consecutive bytes of a byte array
- // -- exhaustively test the pack and unpack methods.
- //
- // This file should be saved as PackableMemory.java. Once it has been
- // compiled, the tester can be invoked by typing "java PackableMemory"
-
- public class PackableMemory {
- int size;
- public byte mem[] = null;
-
- public PackableMemory(int size)
- {
- this.size = size;
- this.mem = new byte[size];
- }
-
- // Pack the 4-byte integer val into the four bytes mem[loc]...mem[loc+3].
- // The most significant porion of the integer is stored in mem[loc].
- // Bytes are masked out of the integer and stored in the array, working
- // from right(least significant) to left (most significant).
- public void pack(int val, int loc)
- {
- final int MASK = 0xff;
- for (int i = 3; i >= 0; i--)
- {
- mem[loc+i] = (byte)(val & MASK);
- val = val >> 8;
- }
- }
-
- // Unpack the four bytes mem[loc]...mem[loc+3] into a 4-byte integer,
- // and return the resulting integer value.
- // The most significant porion of the integer is stored in mem[loc].
- // Bytes are 'OR'ed into the integer, working from left (most significant)
- // to right (least significant)
- public int unpack(int loc)
- {
- final int MASK = 0xff;
- int v = (int)mem[loc] & MASK;
- for (int i = 1; i < 4; i++)
- {
- v = v << 8;
- v = v | ((int)mem[loc+i] & MASK);
- }
- return v;
- }
-
-
-
- // Test the above pack and unpack methods by iterating the following
- // over all possible 4-byte integers: pack the integer,
- // then unpack it, and then verify that the unpacked integer equals the
- // original integer. It tests all nonnegative numbers in ascending order
- // and then all negative numbers in ascending order. The transition from
- // positive to negative numbers happens implicitly due to integer overflow.
- public void packTest()
- {
-
- int i = 0;
- long k = 0;
- do
- {
- this.pack(i,4);
- int j = this.unpack(4);
- if (j != i)
- {
- System.out.printf("pack/unpack test failed: i = %d, j = %d\n",i,j);
- System.exit(0);
- }
- i++; k++;
- }
- while (i != 0);
- System.out.printf("pack/unpack test successful, %d iterations\n",k);
- }
-
- // main routine to test the PackableMemory class by running the
- // packTest() method.
- public static void main(String[] args)
- {
- PackableMemory pm = new PackableMemory(100);
- pm.packTest();
- System.exit(0);
- }
- }
-
|