tikhomirov@0: /** tikhomirov@0: * Copyright (c) 2010 Artem Tikhomirov tikhomirov@0: */ tikhomirov@0: package com.tmate.hgkit.ll; tikhomirov@0: tikhomirov@0: import java.math.BigInteger; tikhomirov@0: import java.util.Formatter; tikhomirov@0: tikhomirov@0: /** tikhomirov@0: * @see mercurial/node.py tikhomirov@0: * @author artem tikhomirov@0: * tikhomirov@0: */ tikhomirov@0: public class Nodeid { tikhomirov@0: tikhomirov@0: public static int NULLREV = -1; tikhomirov@0: private final byte[] binaryData; tikhomirov@0: tikhomirov@0: public Nodeid(byte[] binaryRepresentation) { tikhomirov@0: // 5 int fields => 32 bytes tikhomirov@0: // byte[20] => 48 bytes tikhomirov@0: this.binaryData = binaryRepresentation; tikhomirov@0: } tikhomirov@0: tikhomirov@0: @Override tikhomirov@0: public String toString() { tikhomirov@0: // FIXME temp impl. tikhomirov@0: // BEWARE, if binaryData[0] > 0x80, BigInteger treats it as negative tikhomirov@0: return new BigInteger(binaryData).toString(); tikhomirov@0: } tikhomirov@0: tikhomirov@0: // binascii.unhexlify() tikhomirov@0: public static Nodeid fromAscii(byte[] asciiRepresentation, int offset, int length) { tikhomirov@0: assert length % 2 == 0; // Python's binascii.hexlify convert each byte into 2 digits tikhomirov@0: byte[] data = new byte[length / 2]; // XXX use known size instead? nodeid is always 20 bytes tikhomirov@0: for (int i = 0, j = offset; i < data.length; i++) { tikhomirov@0: int hiNibble = Character.digit(asciiRepresentation[j++], 16); tikhomirov@0: int lowNibble = Character.digit(asciiRepresentation[j++], 16); tikhomirov@0: data[i] = (byte) (((hiNibble << 4) | lowNibble) & 0xFF); tikhomirov@0: } tikhomirov@0: return new Nodeid(data); tikhomirov@0: } tikhomirov@0: tikhomirov@0: tikhomirov@0: }