title: Unable to unpack comp 3 to numeric in java
body: <p>I referred a code on the internet to unpack comp 3 to numeric in java. I tried to pass a sample comp3 file to the code but I didn't get the proper unpacked data. I got some weird numbers. I am new to this concept(comp 3) so can you guys help me on this. Thanks in advance</p>
  
  <p><strong>Below is my code</strong></p>
  
  <hr>
  
  <pre><code>import java.math.BigInteger;
  import java.nio.file.Files;
  import java.nio.file.Path;
  import java.nio.file.Paths;
  
  /**
   * Converts between integer and an array of bytes in IBM mainframe packed
   * decimal format. The number of bytes required to store an integer is (digits +
   * 1) / 2. For example, a 7 digit number can be stored in 4 bytes. Each pair of
   * digits is packed into the two nibbles of one byte. The last nibble contains
   * the sign, 0F for positive and 0C for negative. For example 7654321 becomes
   * 0x76 0x54 0x32 0x1F.
   * 
   * This class is immutable. Once constructed you can extract the value as an
   * int, an array of bytes but you cannot change the value. Someone should
   * implement equals() and hashcode() to make this thing truly useful.
   */
  
  public class PackedDecimalToComp {
  
      public static void main(String[] args) {
  
          try {
              // test.unpackData(" 0x12345s");
              Path path = Paths.get("C:\\Users\\AV00499269\\Desktop\\Comp3 data file\\Comp3Test.txt");
              byte[] data = Files.readAllBytes(path);
              PackedDecimalToComp test = new PackedDecimalToComp();
              test.unpackData(data);
          } catch (Exception ex) {
              System.out.println("Exception is :" + ex.getMessage());
          }    
      }
  
      private static String unpackData(byte[] packedData) {
          String unpackedData = "";
  
          final int negativeSign = 13;
          for (int currentCharIndex = 0; currentCharIndex &lt; packedData.length; currentCharIndex++) {
              byte firstDigit = (byte) ((packedData[currentCharIndex] &gt;&gt;&gt; 4) &amp; 0x0F);
              byte secondDigit = (byte) (packedData[currentCharIndex] &amp; 0x0F);
              unpackedData += String.valueOf(firstDigit);
              if (currentCharIndex == (packedData.length - 1)) {
                  if (secondDigit == negativeSign) {
                      unpackedData = "-" + unpackedData;
                  }
              } else {
                  unpackedData += String.valueOf(secondDigit);
              }
          }
          System.out.println("Unpackeddata is :" + unpackedData);
  
          return unpackedData;
      }    
  }
  </code></pre>
  
  <hr>
  
  <p>Comp3 file I passed has values <code>x019F</code></p>
  
  <p>When converted I got the unpacked data as <code>783031394</code></p>