1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.formats.tiff.taginfos;
18
19 import java.nio.ByteOrder;
20 import java.nio.charset.StandardCharsets;
21 import java.util.Arrays;
22
23 import org.apache.commons.imaging.ImagingException;
24 import org.apache.commons.imaging.formats.tiff.TiffField;
25 import org.apache.commons.imaging.formats.tiff.constants.TiffDirectoryType;
26 import org.apache.commons.imaging.formats.tiff.fieldtypes.AbstractFieldType;
27
28
29
30
31 public class TagInfoXpString extends TagInfo {
32 public TagInfoXpString(final String name, final int tag, final TiffDirectoryType directoryType) {
33 super(name, tag, AbstractFieldType.BYTE, LENGTH_UNKNOWN, directoryType);
34 }
35
36 @Override
37 public byte[] encodeValue(final AbstractFieldType abstractFieldType, final Object value, final ByteOrder byteOrder) throws ImagingException {
38 if (!(value instanceof String)) {
39 throw new ImagingException("Text value not String", value);
40 }
41 final String s = (String) value;
42 final byte[] bytes = s.getBytes(StandardCharsets.UTF_16LE);
43 return Arrays.copyOf(bytes, bytes.length + 2);
44 }
45
46 @Override
47 public String getValue(final TiffField entry) throws ImagingException {
48 if (entry.getFieldType() != AbstractFieldType.BYTE) {
49 throw new ImagingException("Text field not encoded as bytes.");
50 }
51 final byte[] bytes = entry.getByteArrayValue();
52 final int length;
53 if (bytes.length >= 2 && bytes[bytes.length - 1] == 0 && bytes[bytes.length - 2] == 0) {
54 length = bytes.length - 2;
55 } else {
56 length = bytes.length;
57 }
58 return new String(bytes, 0, length, StandardCharsets.UTF_16LE);
59 }
60 }