private void writeOldAsciiEntry(final CpioArchiveEntry entry) throws IOException {
    long inode = entry.getInode();
    long device = entry.getDevice();
    if (CPIO_TRAILER.equals(entry.getName())) {
      inode = device = 0;
    } else {
      if (inode == 0 && device == 0) {
        inode = nextArtificalDeviceAndInode & 0777777;
        device = (nextArtificalDeviceAndInode++ >> 18) & 0777777;
      } else {
        nextArtificalDeviceAndInode =
            Math.max(nextArtificalDeviceAndInode, inode + 01000000 * device) + 1;
      }
    }

    writeAsciiLong(device, 6, 8);
    writeAsciiLong(inode, 6, 8);
    writeAsciiLong(entry.getMode(), 6, 8);
    writeAsciiLong(entry.getUID(), 6, 8);
    writeAsciiLong(entry.getGID(), 6, 8);
    writeAsciiLong(entry.getNumberOfLinks(), 6, 8);
    writeAsciiLong(entry.getRemoteDevice(), 6, 8);
    writeAsciiLong(entry.getTime(), 11, 8);
    writeAsciiLong(entry.getName().length() + 1l, 6, 8);
    writeAsciiLong(entry.getSize(), 11, 8);
    writeCString(entry.getName());
  }
  private void writeOldBinaryEntry(final CpioArchiveEntry entry, final boolean swapHalfWord)
      throws IOException {
    long inode = entry.getInode();
    long device = entry.getDevice();
    if (CPIO_TRAILER.equals(entry.getName())) {
      inode = device = 0;
    } else {
      if (inode == 0 && device == 0) {
        inode = nextArtificalDeviceAndInode & 0xFFFF;
        device = (nextArtificalDeviceAndInode++ >> 16) & 0xFFFF;
      } else {
        nextArtificalDeviceAndInode =
            Math.max(nextArtificalDeviceAndInode, inode + 0x10000 * device) + 1;
      }
    }

    writeBinaryLong(device, 2, swapHalfWord);
    writeBinaryLong(inode, 2, swapHalfWord);
    writeBinaryLong(entry.getMode(), 2, swapHalfWord);
    writeBinaryLong(entry.getUID(), 2, swapHalfWord);
    writeBinaryLong(entry.getGID(), 2, swapHalfWord);
    writeBinaryLong(entry.getNumberOfLinks(), 2, swapHalfWord);
    writeBinaryLong(entry.getRemoteDevice(), 2, swapHalfWord);
    writeBinaryLong(entry.getTime(), 4, swapHalfWord);
    writeBinaryLong(entry.getName().length() + 1l, 2, swapHalfWord);
    writeBinaryLong(entry.getSize(), 4, swapHalfWord);
    writeCString(entry.getName());
    pad(entry.getHeaderPadCount());
  }
  private void writeNewEntry(final CpioArchiveEntry entry) throws IOException {
    long inode = entry.getInode();
    long devMin = entry.getDeviceMin();
    if (CPIO_TRAILER.equals(entry.getName())) {
      inode = devMin = 0;
    } else {
      if (inode == 0 && devMin == 0) {
        inode = nextArtificalDeviceAndInode & 0xFFFFFFFF;
        devMin = (nextArtificalDeviceAndInode++ >> 32) & 0xFFFFFFFF;
      } else {
        nextArtificalDeviceAndInode =
            Math.max(nextArtificalDeviceAndInode, inode + 0x100000000L * devMin) + 1;
      }
    }

    writeAsciiLong(inode, 8, 16);
    writeAsciiLong(entry.getMode(), 8, 16);
    writeAsciiLong(entry.getUID(), 8, 16);
    writeAsciiLong(entry.getGID(), 8, 16);
    writeAsciiLong(entry.getNumberOfLinks(), 8, 16);
    writeAsciiLong(entry.getTime(), 8, 16);
    writeAsciiLong(entry.getSize(), 8, 16);
    writeAsciiLong(entry.getDeviceMaj(), 8, 16);
    writeAsciiLong(devMin, 8, 16);
    writeAsciiLong(entry.getRemoteDeviceMaj(), 8, 16);
    writeAsciiLong(entry.getRemoteDeviceMin(), 8, 16);
    writeAsciiLong(entry.getName().length() + 1l, 8, 16);
    writeAsciiLong(entry.getChksum(), 8, 16);
    writeCString(entry.getName());
    pad(entry.getHeaderPadCount());
  }