001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.zip;
020:
021: /**
022: * Utility class that represents a two byte integer with conversion
023: * rules for the big endian byte order of ZIP files.
024: *
025: */
026: public final class ZipShort implements Cloneable {
027:
028: private int value;
029:
030: /**
031: * Create instance from a number.
032: * @param value the int to store as a ZipShort
033: * @since 1.1
034: */
035: public ZipShort(int value) {
036: this .value = value;
037: }
038:
039: /**
040: * Create instance from bytes.
041: * @param bytes the bytes to store as a ZipShort
042: * @since 1.1
043: */
044: public ZipShort(byte[] bytes) {
045: this (bytes, 0);
046: }
047:
048: /**
049: * Create instance from the two bytes starting at offset.
050: * @param bytes the bytes to store as a ZipShort
051: * @param offset the offset to start
052: * @since 1.1
053: */
054: public ZipShort(byte[] bytes, int offset) {
055: value = ZipShort.getValue(bytes, offset);
056: }
057:
058: /**
059: * Get value as two bytes in big endian byte order.
060: * @return the value as a a two byte array in big endian byte order
061: * @since 1.1
062: */
063: public byte[] getBytes() {
064: byte[] result = new byte[2];
065: result[0] = (byte) (value & 0xFF);
066: result[1] = (byte) ((value & 0xFF00) >> 8);
067: return result;
068: }
069:
070: /**
071: * Get value as Java int.
072: * @return value as a Java int
073: * @since 1.1
074: */
075: public int getValue() {
076: return value;
077: }
078:
079: /**
080: * Get value as two bytes in big endian byte order.
081: * @param value the Java int to convert to bytes
082: * @return the converted int as a byte array in big endian byte order
083: */
084: public static byte[] getBytes(int value) {
085: byte[] result = new byte[2];
086: result[0] = (byte) (value & 0xFF);
087: result[1] = (byte) ((value & 0xFF00) >> 8);
088: return result;
089: }
090:
091: /**
092: * Helper method to get the value as a java int from two bytes starting at given array offset
093: * @param bytes the array of bytes
094: * @param offset the offset to start
095: * @return the correspondanding java int value
096: */
097: public static int getValue(byte[] bytes, int offset) {
098: int value = (bytes[offset + 1] << 8) & 0xFF00;
099: value += (bytes[offset] & 0xFF);
100: return value;
101: }
102:
103: /**
104: * Helper method to get the value as a java int from a two-byte array
105: * @param bytes the array of bytes
106: * @return the correspondanding java int value
107: */
108: public static int getValue(byte[] bytes) {
109: return getValue(bytes, 0);
110: }
111:
112: /**
113: * Override to make two instances with same value equal.
114: * @param o an object to compare
115: * @return true if the objects are equal
116: * @since 1.1
117: */
118: public boolean equals(Object o) {
119: if (o == null || !(o instanceof ZipShort)) {
120: return false;
121: }
122: return value == ((ZipShort) o).getValue();
123: }
124:
125: /**
126: * Override to make two instances with same value equal.
127: * @return the value stored in the ZipShort
128: * @since 1.1
129: */
130: public int hashCode() {
131: return value;
132: }
133: }
|