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
22 import org.apache.commons.imaging.ImagingException;
23 import org.apache.commons.imaging.common.Allocator;
24 import org.apache.commons.imaging.formats.tiff.constants.TiffDirectoryType;
25 import org.apache.commons.imaging.formats.tiff.fieldtypes.AbstractFieldType;
26
27 public class TagInfoAscii extends TagInfo {
28 public TagInfoAscii(final String name, final int tag, final int length, final TiffDirectoryType directoryType) {
29 super(name, tag, AbstractFieldType.ASCII, length, directoryType);
30 }
31
32 public byte[] encodeValue(final ByteOrder byteOrder, final String... values) throws ImagingException {
33 return AbstractFieldType.ASCII.writeData(values, byteOrder);
34 }
35
36 public String[] getValue(final ByteOrder byteOrder, final byte[] bytes) {
37 int nullCount = 0;
38 for (int i = 0; i < bytes.length - 1; i++) {
39 if (bytes[i] == 0) {
40 nullCount++;
41 }
42 }
43 final String[] strings = Allocator.array(nullCount + 1, String[]::new, 24);
44 int stringsAdded = 0;
45 strings[0] = "";
46 int nextStringPos = 0;
47
48
49
50 for (int i = 0; i < bytes.length; i++) {
51 if (bytes[i] == 0) {
52 final String string = new String(bytes, nextStringPos, i - nextStringPos, StandardCharsets.UTF_8);
53 strings[stringsAdded++] = string;
54 nextStringPos = i + 1;
55 }
56 }
57 if (nextStringPos < bytes.length) {
58
59 final String string = new String(bytes, nextStringPos, bytes.length - nextStringPos, StandardCharsets.UTF_8);
60 strings[stringsAdded++] = string;
61 }
62 return strings;
63 }
64 }