1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.imaging.formats.tiff.fieldtypes;
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.common.Allocator;
25 import org.apache.commons.imaging.formats.tiff.TiffField;
26
27 public class FieldTypeAscii extends AbstractFieldType {
28 public FieldTypeAscii(final int type, final String name) {
29 super(type, name, 1);
30 }
31
32 @Override
33 public Object getValue(final TiffField entry) {
34
35
36 final byte[] bytes = entry.getByteArrayValue();
37 int nullCount = 1;
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, 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 if (strings.length == 1) {
63 return strings[0];
64 }
65 return strings;
66 }
67
68 @Override
69 public byte[] writeData(final Object o, final ByteOrder byteOrder) throws ImagingException {
70 if (o instanceof byte[]) {
71 final byte[] bytes = (byte[]) o;
72 final byte[] result = Arrays.copyOf(bytes, bytes.length + 1);
73 result[result.length - 1] = 0;
74 return result;
75 }
76 if (o instanceof String) {
77 final byte[] bytes = ((String) o).getBytes(StandardCharsets.UTF_8);
78 final byte[] result = Arrays.copyOf(bytes, bytes.length + 1);
79 result[result.length - 1] = 0;
80 return result;
81 }
82 if (!(o instanceof String[])) {
83 throw new ImagingException("Unknown data type: " + o);
84 }
85 final String[] strings = (String[]) o;
86 int totalLength = 0;
87 for (final String string : strings) {
88 final byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
89 totalLength += bytes.length + 1;
90 }
91 final byte[] result = Allocator.byteArray(totalLength);
92 int position = 0;
93 for (final String string : strings) {
94 final byte[] bytes = string.getBytes(StandardCharsets.UTF_8);
95 System.arraycopy(bytes, 0, result, position, bytes.length);
96 position += bytes.length + 1;
97 }
98 return result;
99 }
100
101 }