private int parseComplexField(int start, int end, int level) {

    if (start == end + 1) {

      // Data prematurely ended. Return start - 1 so we don't move our field position.
      return start - 1;
    }

    final byte separator = separators[level];
    int fieldByteEnd = start;

    final byte[] bytes = this.bytes;

    currentEscapeCount = 0;
    if (!isEscaped) {
      while (fieldByteEnd < end) {
        if (bytes[fieldByteEnd] == separator) {
          return fieldByteEnd;
        }
        fieldByteEnd++;
      }
    } else {
      final byte escapeChar = this.escapeChar;
      final int endLessOne = end - 1;
      int escapeCount = 0;
      // Process the bytes that can be escaped (the last one can't be).
      while (fieldByteEnd < endLessOne) {
        if (bytes[fieldByteEnd] == separator) {
          currentEscapeCount = escapeCount;
          return fieldByteEnd;
        } else if (bytes[fieldByteEnd] == escapeChar) {
          // Ignore the char after escape_char
          fieldByteEnd += 2;
          escapeCount++;
        } else {
          fieldByteEnd++;
        }
      }
      // Process the last byte.
      if (fieldByteEnd == endLessOne) {
        if (bytes[fieldByteEnd] != separator) {
          fieldByteEnd++;
        }
      }
      currentEscapeCount = escapeCount;
    }
    return fieldByteEnd;
  }
Parse the byte[] and fill each field.

This is an adapted version of the parse method in the LazyStruct class.
They should parse things the same way.
serde/src/java/org/apache/hadoop/hive/serde2/lazy/fast/LazySimpleDeserializeRead.java