public virtual void TestGetNullTerminatedString() { sbyte[] bytes = new sbyte[] { unchecked ((int)(0x41)), unchecked ((int)(0x42)), unchecked ((int)(0x43)), unchecked ((int)(0x44)), unchecked ((int)(0x00)), unchecked ((int)(0x45)), unchecked ((int)(0x46)), unchecked ((int)(0x47)) }; RandomAccessReader reader = CreateReader(bytes); Sharpen.Tests.AreEqual(string.Empty, reader.GetNullTerminatedString(0, 0)); Sharpen.Tests.AreEqual("A", reader.GetNullTerminatedString(0, 1)); Sharpen.Tests.AreEqual("AB", reader.GetNullTerminatedString(0, 2)); Sharpen.Tests.AreEqual("ABC", reader.GetNullTerminatedString(0, 3)); Sharpen.Tests.AreEqual("ABCD", reader.GetNullTerminatedString(0, 4)); Sharpen.Tests.AreEqual("ABCD", reader.GetNullTerminatedString(0, 5)); Sharpen.Tests.AreEqual("ABCD", reader.GetNullTerminatedString(0, 6)); Sharpen.Tests.AreEqual("BCD", reader.GetNullTerminatedString(1, 3)); Sharpen.Tests.AreEqual("BCD", reader.GetNullTerminatedString(1, 4)); Sharpen.Tests.AreEqual("BCD", reader.GetNullTerminatedString(1, 5)); Sharpen.Tests.AreEqual(string.Empty, reader.GetNullTerminatedString(4, 3)); }
private static void ProcessTag(Com.Drew.Metadata.Directory directory, int tagType, int tagValueOffset, int componentCount, int formatCode, RandomAccessReader reader) { switch (formatCode) { case FmtUndefined: { // Directory simply stores raw values // The display side uses a Descriptor class per directory to turn the raw values into 'pretty' descriptions // this includes exif user comments directory.SetByteArray(tagType, reader.GetBytes(tagValueOffset, componentCount)); break; } case FmtString: { string @string = reader.GetNullTerminatedString(tagValueOffset, componentCount); directory.SetString(tagType, @string); break; } case FmtSrational: { if (componentCount == 1) { directory.SetRational(tagType, new Rational(reader.GetInt32(tagValueOffset), reader.GetInt32(tagValueOffset + 4))); } else { if (componentCount > 1) { Rational[] rationals = new Rational[componentCount]; for (int i = 0; i < componentCount; i++) { rationals[i] = new Rational(reader.GetInt32(tagValueOffset + (8 * i)), reader.GetInt32(tagValueOffset + 4 + (8 * i))); } directory.SetRationalArray(tagType, rationals); } } break; } case FmtUrational: { if (componentCount == 1) { directory.SetRational(tagType, new Rational(reader.GetUInt32(tagValueOffset), reader.GetUInt32(tagValueOffset + 4))); } else { if (componentCount > 1) { Rational[] rationals = new Rational[componentCount]; for (int i = 0; i < componentCount; i++) { rationals[i] = new Rational(reader.GetUInt32(tagValueOffset + (8 * i)), reader.GetUInt32(tagValueOffset + 4 + (8 * i))); } directory.SetRationalArray(tagType, rationals); } } break; } case FmtSingle: { if (componentCount == 1) { directory.SetFloat(tagType, reader.GetFloat32(tagValueOffset)); } else { float[] floats = new float[componentCount]; for (int i = 0; i < componentCount; i++) { floats[i] = reader.GetFloat32(tagValueOffset + (i * 4)); } directory.SetFloatArray(tagType, floats); } break; } case FmtDouble: { if (componentCount == 1) { directory.SetDouble(tagType, reader.GetDouble64(tagValueOffset)); } else { double[] doubles = new double[componentCount]; for (int i = 0; i < componentCount; i++) { doubles[i] = reader.GetDouble64(tagValueOffset + (i * 4)); } directory.SetDoubleArray(tagType, doubles); } break; } case FmtSbyte: { // // Note that all integral types are stored as int32 internally (the largest supported by TIFF) // if (componentCount == 1) { directory.SetInt(tagType, reader.GetInt8(tagValueOffset)); } else { int[] bytes = new int[componentCount]; for (int i = 0; i < componentCount; i++) { bytes[i] = reader.GetInt8(tagValueOffset + i); } directory.SetIntArray(tagType, bytes); } break; } case FmtByte: { if (componentCount == 1) { directory.SetInt(tagType, reader.GetUInt8(tagValueOffset)); } else { int[] bytes = new int[componentCount]; for (int i = 0; i < componentCount; i++) { bytes[i] = reader.GetUInt8(tagValueOffset + i); } directory.SetIntArray(tagType, bytes); } break; } case FmtUshort: { if (componentCount == 1) { int i = reader.GetUInt16(tagValueOffset); directory.SetInt(tagType, i); } else { int[] ints = new int[componentCount]; for (int i = 0; i < componentCount; i++) { ints[i] = reader.GetUInt16(tagValueOffset + (i * 2)); } directory.SetIntArray(tagType, ints); } break; } case FmtSshort: { if (componentCount == 1) { int i = reader.GetInt16(tagValueOffset); directory.SetInt(tagType, i); } else { int[] ints = new int[componentCount]; for (int i = 0; i < componentCount; i++) { ints[i] = reader.GetInt16(tagValueOffset + (i * 2)); } directory.SetIntArray(tagType, ints); } break; } case FmtSlong: case FmtUlong: { // NOTE 'long' in this case means 32 bit, not 64 if (componentCount == 1) { int i = reader.GetInt32(tagValueOffset); directory.SetInt(tagType, i); } else { int[] ints = new int[componentCount]; for (int i = 0; i < componentCount; i++) { ints[i] = reader.GetInt32(tagValueOffset + (i * 4)); } directory.SetIntArray(tagType, ints); } break; } default: { directory.AddError("Unknown format code " + formatCode + " for tag " + tagType); break; } } }
/// <exception cref="System.IO.IOException"/> private static void ProcessTag(TiffHandler handler, int tagId, int tagValueOffset, int componentCount, int formatCode, RandomAccessReader reader) { switch (formatCode) { case TiffDataFormat.CodeUndefined: { // this includes exif user comments handler.SetByteArray(tagId, reader.GetBytes(tagValueOffset, componentCount)); break; } case TiffDataFormat.CodeString: { handler.SetString(tagId, reader.GetNullTerminatedString(tagValueOffset, componentCount)); break; } case TiffDataFormat.CodeRationalS: { if (componentCount == 1) { handler.SetRational(tagId, new Rational(reader.GetInt32(tagValueOffset), reader.GetInt32(tagValueOffset + 4))); } else { if (componentCount > 1) { Rational[] array = new Rational[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = new Rational(reader.GetInt32(tagValueOffset + (8 * i)), reader.GetInt32(tagValueOffset + 4 + (8 * i))); } handler.SetRationalArray(tagId, array); } } break; } case TiffDataFormat.CodeRationalU: { if (componentCount == 1) { handler.SetRational(tagId, new Rational(reader.GetUInt32(tagValueOffset), reader.GetUInt32(tagValueOffset + 4))); } else { if (componentCount > 1) { Rational[] array = new Rational[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = new Rational(reader.GetUInt32(tagValueOffset + (8 * i)), reader.GetUInt32(tagValueOffset + 4 + (8 * i))); } handler.SetRationalArray(tagId, array); } } break; } case TiffDataFormat.CodeSingle: { if (componentCount == 1) { handler.SetFloat(tagId, reader.GetFloat32(tagValueOffset)); } else { float[] array = new float[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetFloat32(tagValueOffset + (i * 4)); } handler.SetFloatArray(tagId, array); } break; } case TiffDataFormat.CodeDouble: { if (componentCount == 1) { handler.SetDouble(tagId, reader.GetDouble64(tagValueOffset)); } else { double[] array = new double[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetDouble64(tagValueOffset + (i * 4)); } handler.SetDoubleArray(tagId, array); } break; } case TiffDataFormat.CodeInt8S: { if (componentCount == 1) { handler.SetInt8s(tagId, reader.GetInt8(tagValueOffset)); } else { sbyte[] array = new sbyte[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetInt8(tagValueOffset + i); } handler.SetInt8sArray(tagId, array); } break; } case TiffDataFormat.CodeInt8U: { if (componentCount == 1) { handler.SetInt8u(tagId, reader.GetUInt8(tagValueOffset)); } else { short[] array = new short[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetUInt8(tagValueOffset + i); } handler.SetInt8uArray(tagId, array); } break; } case TiffDataFormat.CodeInt16S: { if (componentCount == 1) { handler.SetInt16s(tagId, (int)reader.GetInt16(tagValueOffset)); } else { short[] array = new short[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetInt16(tagValueOffset + (i * 2)); } handler.SetInt16sArray(tagId, array); } break; } case TiffDataFormat.CodeInt16U: { if (componentCount == 1) { handler.SetInt16u(tagId, reader.GetUInt16(tagValueOffset)); } else { int[] array = new int[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetUInt16(tagValueOffset + (i * 2)); } handler.SetInt16uArray(tagId, array); } break; } case TiffDataFormat.CodeInt32S: { // NOTE 'long' in this case means 32 bit, not 64 if (componentCount == 1) { handler.SetInt32s(tagId, reader.GetInt32(tagValueOffset)); } else { int[] array = new int[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetInt32(tagValueOffset + (i * 4)); } handler.SetInt32sArray(tagId, array); } break; } case TiffDataFormat.CodeInt32U: { // NOTE 'long' in this case means 32 bit, not 64 if (componentCount == 1) { handler.SetInt32u(tagId, reader.GetUInt32(tagValueOffset)); } else { long[] array = new long[componentCount]; for (int i = 0; i < componentCount; i++) { array[i] = reader.GetUInt32(tagValueOffset + (i * 4)); } handler.SetInt32uArray(tagId, array); } break; } default: { handler.Error(Sharpen.Extensions.StringFormat("Unknown format code %d for tag %d", formatCode, tagId)); break; } } }