Skip to content

Commit 59f9b3e

Browse files
authored
Merge pull request #361 from iamcarbon/spans
Spanify various things and use UTF-8 literals
2 parents df68e4f + c240e7c commit 59f9b3e

File tree

16 files changed

+137
-127
lines changed

16 files changed

+137
-127
lines changed

MetadataExtractor/Formats/Apple/BplistReader.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,21 @@ public sealed class BplistReader
1111
// https://opensource.apple.com/source/CF/CF-550/CFBinaryPList.c
1212
// https://synalysis.com/how-to-decode-apple-binary-property-list-files/
1313

14-
private static readonly byte[] _bplistHeader = [(byte)'b', (byte)'p', (byte)'l', (byte)'i', (byte)'s', (byte)'t', (byte)'0', (byte)'0'];
14+
private static ReadOnlySpan<byte> BplistHeader => "bplist00"u8;
1515

1616
/// <summary>
1717
/// Gets whether <paramref name="bplist"/> starts with the expected header bytes.
1818
/// </summary>
1919
public static bool IsValid(byte[] bplist)
2020
{
21-
if (bplist.Length < _bplistHeader.Length)
21+
if (bplist.Length < BplistHeader.Length)
2222
{
2323
return false;
2424
}
2525

26-
for (int i = 0; i < _bplistHeader.Length; i++)
26+
for (int i = 0; i < BplistHeader.Length; i++)
2727
{
28-
if (bplist[i] != _bplistHeader[i])
28+
if (bplist[i] != BplistHeader[i])
2929
{
3030
return false;
3131
}

MetadataExtractor/Formats/Eps/EpsReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,15 +254,15 @@ private static void ExtractIccData(List<Directory> directories, SequentialReader
254254
/// </summary>
255255
private static void ExtractXmpData(List<Directory> directories, SequentialReader reader)
256256
{
257-
byte[] xmp = ReadUntil(reader, Encoding.UTF8.GetBytes("<?xpacket end=\"w\"?>"));
257+
byte[] xmp = ReadUntil(reader, "<?xpacket end=\"w\"?>"u8);
258258
directories.Add(new XmpReader().Extract(xmp));
259259
}
260260

261261
/// <summary>
262262
/// Reads all bytes until the given sentinel is observed.
263263
/// The sentinel will be included in the returned bytes.
264264
/// </summary>
265-
private static byte[] ReadUntil(SequentialReader reader, byte[] sentinel)
265+
private static byte[] ReadUntil(SequentialReader reader, ReadOnlySpan<byte> sentinel)
266266
{
267267
var bytes = new MemoryStream();
268268

MetadataExtractor/Formats/Exif/ExifReader.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ public sealed class ExifReader : JpegSegmentWithPreambleMetadataReader
1515
{
1616
public const string JpegSegmentPreamble = "Exif\x0\x0";
1717

18-
private static readonly byte[] _preambleBytes = Encoding.ASCII.GetBytes(JpegSegmentPreamble);
18+
private static ReadOnlySpan<byte> ExifPreamble => "Exif\x0\x0"u8;
1919

20-
public static bool StartsWithJpegExifPreamble(byte[] bytes) => bytes.StartsWith(_preambleBytes);
20+
public static bool StartsWithJpegExifPreamble(byte[] bytes) => bytes.AsSpan().StartsWith(ExifPreamble);
2121

22-
public static int JpegSegmentPreambleLength => _preambleBytes.Length;
22+
public static int JpegSegmentPreambleLength => ExifPreamble.Length;
2323

2424
/// <summary>Exif data stored in JPEG files' APP1 segment are preceded by this six character preamble "Exif\0\0".</summary>
25-
protected override byte[] PreambleBytes => _preambleBytes;
25+
protected override ReadOnlySpan<byte> PreambleBytes => ExifPreamble;
2626

27-
public override ICollection<JpegSegmentType> SegmentTypes { get; } = new[] { JpegSegmentType.App1 };
27+
public override ICollection<JpegSegmentType> SegmentTypes { get; } = [JpegSegmentType.App1];
2828

2929
protected override IEnumerable<Directory> Extract(byte[] segmentBytes, int preambleLength)
3030
{

MetadataExtractor/Formats/Icc/IccReader.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ namespace MetadataExtractor.Formats.Icc
1818
public sealed class IccReader : IJpegSegmentMetadataReader
1919
{
2020
public const string JpegSegmentPreamble = "ICC_PROFILE"; // TODO what are the extra three bytes here? are they always the same?
21-
private static readonly byte[] _jpegSegmentPreambleBytes = Encoding.UTF8.GetBytes(JpegSegmentPreamble);
21+
private static ReadOnlySpan<byte> JpegSegmentPreambleBytes => "ICC_PROFILE"u8;
2222

2323
// NOTE the header is 14 bytes, while "ICC_PROFILE" is 11
2424
private const int JpegSegmentPreambleLength = 14;
2525

26-
ICollection<JpegSegmentType> IJpegSegmentMetadataReader.SegmentTypes { get; } = new[] { JpegSegmentType.App2 };
26+
ICollection<JpegSegmentType> IJpegSegmentMetadataReader.SegmentTypes { get; } = [JpegSegmentType.App2];
2727

2828
public IEnumerable<Directory> ReadJpegSegments(IEnumerable<JpegSegment> segments)
2929
{
3030
// ICC data can be spread across multiple JPEG segments.
3131

3232
// Skip any segments that do not contain the required preamble
33-
var iccSegments = segments.Where(segment => segment.Bytes.Length > JpegSegmentPreambleLength && segment.Bytes.StartsWith(_jpegSegmentPreambleBytes)).ToList();
33+
var iccSegments = segments.Where(segment => segment.Bytes.Length > JpegSegmentPreambleLength && segment.Bytes.AsSpan().StartsWith(JpegSegmentPreambleBytes)).ToList();
3434

3535
if (iccSegments.Count == 0)
3636
return Enumerable.Empty<Directory>();

MetadataExtractor/Formats/Iso14496/Boxes/ColorInformationBox.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@ namespace MetadataExtractor.Formats.Iso14496.Boxes
44
{
55
internal sealed class ColorInformationBox : Box
66
{
7-
private static readonly byte[] _emptyByteArray = [];
8-
97
public const uint NclxTag = 0x6E636C78; // nclx
108
public const uint RICCTag = 0x72494343; // rICC
119
public const uint ProfTag = 0x70726F66; // prof
@@ -30,7 +28,7 @@ public ColorInformationBox(BoxLocation location, SequentialReader sr)
3028
TransferCharacteristics = sr.GetUInt16();
3129
MatrixCharacteristics = sr.GetUInt16();
3230
FullRangeFlag = (sr.GetByte() & 128) == 128;
33-
IccProfile = _emptyByteArray;
31+
IccProfile = [];
3432
break;
3533
}
3634
case RICCTag:
@@ -41,7 +39,7 @@ public ColorInformationBox(BoxLocation location, SequentialReader sr)
4139
}
4240
default:
4341
{
44-
IccProfile = _emptyByteArray;
42+
IccProfile = [];
4543
break;
4644
}
4745
}

MetadataExtractor/Formats/Jfif/JfifReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ public sealed class JfifReader : JpegSegmentWithPreambleMetadataReader
1717
{
1818
public const string JpegSegmentPreamble = "JFIF";
1919

20-
protected override byte[] PreambleBytes { get; } = Encoding.ASCII.GetBytes(JpegSegmentPreamble);
20+
protected override ReadOnlySpan<byte> PreambleBytes => "JFIF"u8;
2121

22-
public override ICollection<JpegSegmentType> SegmentTypes { get; } = new[] { JpegSegmentType.App0 };
22+
public override ICollection<JpegSegmentType> SegmentTypes { get; } = [JpegSegmentType.App0];
2323

2424
protected override IEnumerable<Directory> Extract(byte[] segmentBytes, int preambleLength)
2525
{

MetadataExtractor/Formats/Jfxx/JfxxReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ public sealed class JfxxReader : JpegSegmentWithPreambleMetadataReader
1717
{
1818
public const string JpegSegmentPreamble = "JFXX";
1919

20-
protected override byte[] PreambleBytes { get; } = Encoding.ASCII.GetBytes(JpegSegmentPreamble);
20+
protected override ReadOnlySpan<byte> PreambleBytes => "JFXX"u8;
2121

22-
public override ICollection<JpegSegmentType> SegmentTypes { get; } = new[] { JpegSegmentType.App0 };
22+
public override ICollection<JpegSegmentType> SegmentTypes { get; } = [JpegSegmentType.App0];
2323

2424
protected override IEnumerable<Directory> Extract(byte[] segmentBytes, int preambleLength)
2525
{

MetadataExtractor/Formats/Jpeg/JpegSegmentWithPreambleMetadataReader.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,16 @@ namespace MetadataExtractor.Formats.Jpeg
44
{
55
public abstract class JpegSegmentWithPreambleMetadataReader : IJpegSegmentMetadataReader
66
{
7-
protected abstract byte[] PreambleBytes { get; }
7+
protected abstract ReadOnlySpan<byte> PreambleBytes { get; }
88

99
public abstract ICollection<JpegSegmentType> SegmentTypes { get; }
1010

1111
public IEnumerable<Directory> ReadJpegSegments(IEnumerable<JpegSegment> segments)
1212
{
13-
var preamble = PreambleBytes;
14-
1513
// Skip segments not starting with the required preamble
1614
return segments
17-
.Where(segment => segment.Bytes.StartsWith(preamble))
18-
.SelectMany(segment => Extract(segment.Bytes, preambleLength: preamble.Length));
15+
.Where(segment => segment.Bytes.AsSpan().StartsWith(PreambleBytes))
16+
.SelectMany(segment => Extract(segment.Bytes, preambleLength: PreambleBytes.Length));
1917
}
2018

2119
protected abstract IEnumerable<Directory> Extract(byte[] segmentBytes, int preambleLength);

MetadataExtractor/Formats/Photoshop/PhotoshopReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ public sealed class PhotoshopReader : JpegSegmentWithPreambleMetadataReader
2020
{
2121
public const string JpegSegmentPreamble = "Photoshop 3.0";
2222

23-
protected override byte[] PreambleBytes { get; } = Encoding.ASCII.GetBytes(JpegSegmentPreamble);
23+
protected override ReadOnlySpan<byte> PreambleBytes => "Photoshop 3.0"u8;
2424

25-
public override ICollection<JpegSegmentType> SegmentTypes { get; } = new[] { JpegSegmentType.AppD };
25+
public override ICollection<JpegSegmentType> SegmentTypes { get; } = [JpegSegmentType.AppD];
2626

2727
protected override IEnumerable<Directory> Extract(byte[] segmentBytes, int preambleLength)
2828
{

MetadataExtractor/Formats/Png/PngChunkReader.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace MetadataExtractor.Formats.Png
55
/// <author>Drew Noakes https://drewnoakes.com</author>
66
public sealed class PngChunkReader
77
{
8-
private static readonly byte[] _pngSignatureBytes = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
8+
private static ReadOnlySpan<byte> PngSignatureBytes => [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
99

1010
/// <exception cref="PngProcessingException"/>
1111
/// <exception cref="IOException"/>
@@ -54,7 +54,7 @@ public IEnumerable<PngChunk> Extract(SequentialReader reader, ICollection<PngChu
5454
// network byte order
5555
reader = reader.WithByteOrder(isMotorolaByteOrder: true);
5656

57-
if (!_pngSignatureBytes.SequenceEqual(reader.GetBytes(_pngSignatureBytes.Length)))
57+
if (!PngSignatureBytes.SequenceEqual(reader.GetBytes(PngSignatureBytes.Length)))
5858
throw new PngProcessingException("PNG signature mismatch");
5959

6060
var seenImageHeader = false;

0 commit comments

Comments
 (0)