I think the layout of tags is missing now in the javadoc. May be it got
missed or moved to some other place?
I remember we had a layout explaining the tag structure then this code is
much easier to read this code.

As Chia-Ping said <tag len(short)><tag type (byte)<tag bytes> is the
layout.
So from the KeyValue lay out we extract the tag part which in itself has a
tag length to represent the complete set of tags.

>From the tags offset and tags length from the KV we extract individual tags
in that KV.

For eg
See TagUtil#asList

{code}
 List<Tag> tags = new ArrayList<>();
    int pos = offset;
    while (pos < offset + length) {
      int tagLen = Bytes.readAsInt(b, pos, TAG_LENGTH_SIZE);
      tags.add(new ArrayBackedTag(b, pos, tagLen + TAG_LENGTH_SIZE));
      pos += TAG_LENGTH_SIZE + tagLen;
    }
    return tags;
{code}

Regards
Ram




On Mon, Aug 7, 2017 at 3:25 AM, Ted Yu <yuzhih...@gmail.com> wrote:

> The byte following the tag length (a short) is the tag type.
>
> The current code is correct.
>
> On Sun, Aug 6, 2017 at 5:40 AM, Chia-Ping Tsai <chia7...@apache.org>
> wrote:
>
> > According to the following code:
> >   public ArrayBackedTag(byte tagType, byte[] tag) {
> >     int tagLength = tag.length + TYPE_LENGTH_SIZE;
> >     if (tagLength > MAX_TAG_LENGTH) {
> >       throw new IllegalArgumentException(
> >           "Invalid tag data being passed. Its length can not exceed " +
> > MAX_TAG_LENGTH);
> >     }
> >     length = TAG_LENGTH_SIZE + tagLength;
> >     bytes = new byte[length];
> >     int pos = Bytes.putAsShort(bytes, 0, tagLength);
> >     pos = Bytes.putByte(bytes, pos, tagType);
> >     Bytes.putBytes(bytes, pos, tag, 0, tag.length);
> >     this.type = tagType;
> >   }
> > The layout of the byte array should be:
> > |tag legnth (2 bytes)|tag type(1 byte)|tag|
> >
> > It seems to me that the "bytes[offset + TYPE_LENGTH_SIZE]" is correct.
> >
> > On 2017-08-06 16:35, Lars George <lars.geo...@gmail.com> wrote:
> > > Hi,
> > >
> > > I found this reading through tags in 1.3, but checked in trunk as
> > > well. There is this code:
> > >
> > >   public ArrayBackedTag(byte[] bytes, int offset, int length) {
> > >     if (length > MAX_TAG_LENGTH) {
> > >       throw new IllegalArgumentException(
> > >           "Invalid tag data being passed. Its length can not exceed "
> > > + MAX_TAG_LENGTH);
> > >     }
> > >     this.bytes = bytes;
> > >     this.offset = offset;
> > >     this.length = length;
> > >     this.type = bytes[offset + TAG_LENGTH_SIZE];
> > >   }
> > >
> > > I am concerned about the last line of the code, using the wrong
> constant?
> > >
> > >   public final static int TYPE_LENGTH_SIZE = Bytes.SIZEOF_BYTE;
> > >   public final static int TAG_LENGTH_SIZE = Bytes.SIZEOF_SHORT;
> > >
> > > Should this not read
> > >
> > >     this.type = bytes[offset + TYPE_LENGTH_SIZE];
> > >
> > > Would this not read the type from the wrong place in the array?
> > >
> > > Cheers,
> > > Lars
> > >
> >
>

Reply via email to