View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.commons.compress.archivers.cpio;
20  
21  import java.nio.charset.StandardCharsets;
22  import java.util.Arrays;
23  
24  /**
25   * Package private utility class for Cpio
26   *
27   * @Immutable
28   */
29  final class CpioUtil {
30  
31      static final String DEFAULT_CHARSET_NAME = StandardCharsets.US_ASCII.name();
32  
33      /**
34       * Converts a byte array to a long. Halfwords can be swapped by setting swapHalfWord=true.
35       *
36       * @param number       An array of bytes containing a number
37       * @param swapHalfWord Swap halfwords ([0][1][2][3]->[1][0][3][2])
38       * @return The long value
39       * @throws UnsupportedOperationException if number length is not a multiple of 2
40       */
41      static long byteArray2long(final byte[] number, final boolean swapHalfWord) {
42          if (number.length % 2 != 0) {
43              throw new UnsupportedOperationException();
44          }
45  
46          long ret;
47          int pos = 0;
48          final byte[] tmpNumber = Arrays.copyOf(number, number.length);
49  
50          if (!swapHalfWord) {
51              byte tmp = 0;
52              for (pos = 0; pos < tmpNumber.length; pos++) {
53                  tmp = tmpNumber[pos];
54                  tmpNumber[pos++] = tmpNumber[pos];
55                  tmpNumber[pos] = tmp;
56              }
57          }
58  
59          ret = tmpNumber[0] & 0xFF;
60          for (pos = 1; pos < tmpNumber.length; pos++) {
61              ret <<= 8;
62              ret |= tmpNumber[pos] & 0xFF;
63          }
64          return ret;
65      }
66  
67      /**
68       * Extracts the file type bits from a mode.
69       */
70      static long fileType(final long mode) {
71          return mode & CpioConstants.S_IFMT;
72      }
73  
74      /**
75       * Converts a long number to a byte array Halfwords can be swapped by setting swapHalfWord=true.
76       *
77       * @param number       the input long number to be converted
78       * @param length       The length of the returned array
79       * @param swapHalfWord Swap halfwords ([0][1][2][3]->[1][0][3][2])
80       * @return The long value
81       * @throws UnsupportedOperationException if the length is not a positive multiple of two
82       */
83      static byte[] long2byteArray(final long number, final int length, final boolean swapHalfWord) {
84          final byte[] ret = new byte[length];
85          int pos = 0;
86          long tmp_number;
87  
88          if (length % 2 != 0 || length < 2) {
89              throw new UnsupportedOperationException();
90          }
91  
92          tmp_number = number;
93          for (pos = length - 1; pos >= 0; pos--) {
94              ret[pos] = (byte) (tmp_number & 0xFF);
95              tmp_number >>= 8;
96          }
97  
98          if (!swapHalfWord) {
99              byte tmp = 0;
100             for (pos = 0; pos < length; pos++) {
101                 tmp = ret[pos];
102                 ret[pos++] = ret[pos];
103                 ret[pos] = tmp;
104             }
105         }
106 
107         return ret;
108     }
109 }