1 package com.tapina.robe.runtime; 2 3 import java.io.UnsupportedEncodingException; 4 import java.awt.*; 5 6 /*** 7 * Created by IntelliJ IDEA. 8 * User: gareth 9 * Date: Aug 21, 2003 10 * Time: 8:22:42 AM 11 */ 12 public final class ByteArrayUtils { 13 public final static int getInt(byte[] bytes, int offset) { 14 int result = 0; 15 for (int shift = 0; shift < 32; shift += 8) { 16 result |= (((int) bytes[offset++]) & 0xff) << shift; 17 } 18 return result; 19 } 20 21 public final static void putInt(byte[] bytes, int offset, int value) { 22 for (int shift = 0; shift < 32; shift += 8) { 23 bytes[offset++] = (byte) ((value >> shift) & 0xff); 24 } 25 } 26 27 public final static long get5ByteValue(byte[] bytes, int offset) { 28 long result = 0; 29 for (int shift = 0; shift < 40; shift += 8) { 30 result |= (((long) bytes[offset++]) & 0xffL) << shift; 31 } 32 return result; 33 } 34 35 public final static void put5ByteValue(byte[] bytes, int offset, long value) { 36 for (int shift = 0; shift < 40; shift += 8) { 37 bytes[offset++] = (byte) ((value >> shift) & 0xff); 38 } 39 } 40 41 public final static String getString0(byte[] bytes, int offset) { 42 int i; 43 44 for (i = offset; i < bytes.length; i++) { 45 if (bytes[i] == 0) break; 46 } 47 return getString(bytes, offset, i); 48 } 49 50 private static String getString(byte[] bytes, int startOffset, int terminatorOffset) { 51 try { 52 return new String(bytes, startOffset, terminatorOffset - startOffset, "ISO-8859-1"); 53 } catch (UnsupportedEncodingException e) { 54 throw new RuntimeException(e); 55 } 56 } 57 58 public static String getStringControlTerminated(byte[] bytes, int offset, int maxLength) { 59 int i; 60 61 for (i = offset; i < bytes.length && (i - offset) < maxLength; i++) { 62 if (bytes[i] < 32) { 63 break; 64 } 65 } 66 return getString(bytes, offset, i); 67 } 68 69 public final static String getStringN(byte[] bytes, int offset, int maxLength) { 70 int i; 71 72 for (i = offset; i < bytes.length && (i - offset) < maxLength; i++) { 73 if (bytes[i] == 0) break; 74 } 75 return getString(bytes, offset, i); 76 } 77 78 public static String getTerminatedString(byte[] bytes, int offset, StringTerminator stringTerminator, int maxLength) { 79 int i; 80 81 for (i = offset; i < bytes.length && (i - offset) < maxLength; i++) { 82 if (stringTerminator.isTerminalByte(bytes[i])) { 83 break; 84 } 85 } 86 return getString(bytes, offset, i); 87 } 88 89 public final static void putString0(byte[] bytes, int offset, String string) { 90 putTerminatedString(bytes, offset, string, (byte) 0, Integer.MAX_VALUE); 91 } 92 93 public static void putString0(byte[] bytes, int offset, String string, int length) { 94 putTerminatedString(bytes, offset, string, (byte) 0, length); 95 } 96 97 static void putTerminatedString(byte[] bytes, int offset, String string, final byte terminator, 98 int maxLength) { 99 try { 100 byte[] strBytes = string.getBytes("ISO-8859-1"); 101 if (maxLength <= strBytes.length) { 102 System.arraycopy(strBytes, 0, bytes, offset, maxLength); 103 } else { 104 System.arraycopy(strBytes, 0, bytes, offset, strBytes.length); 105 bytes[offset + strBytes.length] = terminator; 106 } 107 } catch (UnsupportedEncodingException e) { 108 throw new RuntimeException(e); 109 } 110 } 111 112 public static void putStringCR(byte[] bytes, int offset, String string) { 113 putTerminatedString(bytes, offset, string, (byte) '\r', Integer.MAX_VALUE); 114 } 115 116 public static Point getPoint(final byte[] data, final int offset) { 117 final int x = getInt(data, offset); 118 final int y = getInt(data, offset + 4); 119 return new Point(x, y); 120 } 121 122 public static Rectangle getRectangle(final byte[] data, final int offset) { 123 final int minX = getInt(data, offset); 124 final int minY = getInt(data, offset + 4); 125 final int width = getInt(data, offset + 8) - minX; 126 final int height = getInt(data, offset + 12) - minY; 127 return new Rectangle(minX, minY, width, height); 128 } 129 130 public static void putRectangle(byte[] data, int offset, Rectangle r) { 131 putInt(data, offset, r.x); 132 putInt(data, offset + 4, r.y); 133 putInt(data, offset + 8, r.x + r.width); 134 putInt(data, offset + 12, r.y + r.height); 135 } 136 137 public static void putPoint(byte[] data, int offset, Point p) { 138 putInt(data, offset, p.x); 139 putInt(data, offset + 4, p.y); 140 } 141 }