|
TerminatedFile |
|
/* * * TerminatedFile - Tim Tyler 2000. * * This code has been placed in the public domain. * You can do what you like with it. * Note that this code comes with no warranty. * */ /* * To Do: * */ class TerminatedFile { public int start = 0; public int length = 0; public byte data[]; public int block_size; // in bytes - e.g. 16 final static byte PAD = (byte)0x00; final static byte MARK = (byte)0x01; final static byte DUD = (byte)0xA5; // anything - but *not* one of the above values... void setGranularity(int n) { block_size = n; } void append(byte b) { data[length++] = b; } void appendMark(byte m, byte p) { data[length++] = m; for (int i = 1; i < block_size; i++) { data[length++] = p; } } void scrubLastCharacter() { length--; } void scrubLastBlock() { length -= block_size; } void makePaddableByteFile() { if (getByte(length - 1) == PAD) { append(MARK); } else { int i = 1; while (getByte(length - i) == MARK) { i++; } if (getByte(length - i) == PAD) { append(MARK); } } } void unmakePaddableByteFile() { int i = 1; while (getByte(length - i) == MARK) { i++; } if (getByte(length - i) == PAD) { scrubLastCharacter(); } } void makePaddableBlockFile() { if (getBlock(length - block_size).isPadding(PAD)) { appendMark(MARK, PAD); } else { int i = block_size; while (getBlock(length - i).isMark(MARK, PAD)) { i += block_size; } if (getBlock(length - i).isPadding(PAD)) { appendMark(MARK, PAD); } } } void unmakePaddableBlockFile() { int i = block_size; while (getBlock(length - i).isMark(MARK, PAD)) { i += block_size; } if (getBlock(length - i).isPadding(PAD)) { scrubLastBlock(); } } void addPadding(int over) { while (((length - start + over) % block_size) != 0) { append(PAD); } } void removePadding() { while (getByte(length - 1) == PAD) { scrubLastCharacter(); } } void addConstant(int c) { int i = start; int temp; int carry = c; while ((carry != 0) && (i < length)) { temp = (data[i] & 0xff) + carry; data[i++] = (byte)(temp); carry = (temp > 0xff) ? 1 : 0; } if ((i >= length) && (carry != 0)) { append((byte)0); } } void subtractConstant(int c) { int i = start; int temp; int carry = c; while ((carry != 0) && (i < length)) { temp = (data[i] & 0xff) - carry; data[i++] = (byte)(temp); carry = (temp < 0) ? 1 : 0; } if ((i >= length) && (carry != 0)) { scrubLastCharacter(); } } // ignores start currently... void xorChecksum() { if (length >= 16) { byte[] cs = Checksum.checksum(this, 16); for (int i = 0; i < 16; i++) { data[i] ^= cs[i]; } } } Block getBlock(int offset) { return new Block(this, offset, block_size); } /** "safely" get byte at offset */ byte getByte(int i) { if (i < start) { return DUD; } if (i >= length) { return DUD; } return data[i]; } /** append n random bytes */ void addRandomPadding(int n) { for (int i = 0; i < n; i++) { append(BIAES.getRandomByte()); } } public static void main(String args[]) { BIAESFrEnd.main(args); } }
|
TerminatedFile |
|