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 <[email protected]> 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
>