public byte[] makeHeader() throws Exception {
   byte[] result = new byte[this.headersize];
   // HEADERPREFIX.CopyTo(result, 0);
   for (int i = 0; i < HEADERPREFIX.length; i++) {
     result[i] = HEADERPREFIX[i];
   }
   result[HEADERPREFIX.length] = VERSION;
   int index = HEADERPREFIX.length + 1;
   BufferFile.Store(this.buffersize, result, index);
   index += BufferFile.INTSTORAGE;
   BufferFile.Store(this.FreeListHead, result, index);
   return result;
 }
 public long StoreNewChunk(byte[] fromArray, int startingAt, int length) throws Exception {
   // get the first buffer as result value
   long currentBufferNumber = this.AllocateBuffer();
   // System.Diagnostics.Debug.WriteLine(" allocating chunk starting at "+currentBufferNumber);
   long result = currentBufferNumber;
   if (length < 0 || startingAt < 0) {
     throw new LinkedFileException(
         "cannot store negative length chunk (" + startingAt + "," + length + ")");
   }
   int endingAt = startingAt + length;
   // special case: zero length chunk
   if (endingAt > fromArray.length) {
     throw new LinkedFileException("array doesn't have this much data: " + endingAt);
   }
   int index = startingAt;
   // store header with length information
   byte[] buffer = new byte[this.buffersize];
   BufferFile.Store(length, buffer, 0);
   int fromIndex = startingAt;
   int firstLength = this.buffersize - BufferFile.INTSTORAGE;
   int stored = 0;
   if (firstLength > length) {
     firstLength = length;
   }
   // Array.Copy(fromArray, fromIndex, buffer, BufferFile.INTSTORAGE, firstLength);
   for (int i = 0; i < firstLength; i++) {
     buffer[BufferFile.INTSTORAGE + i] = fromArray[i];
   }
   stored += firstLength;
   fromIndex += firstLength;
   byte CurrentBufferType = HEAD;
   // store any remaining buffers (no length info)
   while (stored < length) {
     // store current buffer and get next block number
     long NextBufferNumber = this.AllocateBuffer();
     this.SetBuffer(
         currentBufferNumber, CurrentBufferType, buffer, 0, buffer.length, NextBufferNumber);
     currentBufferNumber = NextBufferNumber;
     CurrentBufferType = BODY;
     int nextLength = this.buffersize;
     if (stored + nextLength > length) {
       nextLength = length - stored;
     }
     // Array.Copy(fromArray, fromIndex, buffer, 0, nextLength);
     for (int i = 0; i < nextLength; i++) {
       buffer[i] = fromArray[fromIndex + i];
     }
     stored += nextLength;
     fromIndex += nextLength;
   }
   // store final buffer
   this.SetBuffer(
       currentBufferNumber, CurrentBufferType, buffer, 0, buffer.length, NULLBUFFERPOINTER);
   return result;
 }
 void SetBuffer(
     long buffernumber, byte type, byte[] thebuffer, int start, int length, long NextBufferNumber)
     throws Exception {
   // System.Diagnostics.Debug.WriteLine(" storing chunk type "+type+" at "+buffernumber);
   if (this.buffersize < length) {
     throw new LinkedFileException("buffer size too small " + this.buffersize + "<" + length);
   }
   byte[] fullbuffer = new byte[length + BUFFEROVERHEAD];
   fullbuffer[0] = type;
   BufferFile.Store(NextBufferNumber, fullbuffer, 1);
   if (thebuffer != null) {
     // Array.Copy(thebuffer, start, fullbuffer, BUFFEROVERHEAD, length);
     for (int i = 0; i < length; i++) {
       fullbuffer[BUFFEROVERHEAD + i] = thebuffer[i];
     }
   }
   this.buffers.setBuffer(buffernumber, fullbuffer, 0, fullbuffer.length);
 }