From 322aad848472d0e7ad4334903bf2d80932c08d49 Mon Sep 17 00:00:00 2001 From: Blake Burgess Date: Sun, 7 Dec 2025 22:40:48 -0500 Subject: [PATCH 1/2] TpsBlock: IsCompletePage: address is Int32BE, not LE --- src/TpsParser/TpsBlock.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TpsParser/TpsBlock.cs b/src/TpsParser/TpsBlock.cs index d43c3f3..67c2c0f 100644 --- a/src/TpsParser/TpsBlock.cs +++ b/src/TpsParser/TpsBlock.cs @@ -157,7 +157,7 @@ private static bool IsCompletePage(TpsRandomAccess rx) if (offset < pageSize) { - int address = BinaryPrimitives.ReadInt32LittleEndian(span[offset..]); + int address = BinaryPrimitives.ReadInt32BigEndian(span[offset..]); if (address == position) { From daf762c60d1104c0f90d525490136791f65e8663 Mon Sep 17 00:00:00 2001 From: Blake Burgess Date: Sun, 7 Dec 2025 22:56:49 -0500 Subject: [PATCH 2/2] Add test case and file for complete page issue --- .../ResourceTests/TestCompletePageIssue-11.cs | 51 ++++++++++++++++++ .../Resources/CompletePageIssue-11.tps | Bin 0 -> 2048 bytes 2 files changed, 51 insertions(+) create mode 100644 tests/TpsParser.Tests/ResourceTests/TestCompletePageIssue-11.cs create mode 100644 tests/TpsParser.Tests/Resources/CompletePageIssue-11.tps diff --git a/tests/TpsParser.Tests/ResourceTests/TestCompletePageIssue-11.cs b/tests/TpsParser.Tests/ResourceTests/TestCompletePageIssue-11.cs new file mode 100644 index 0000000..ed345b3 --- /dev/null +++ b/tests/TpsParser.Tests/ResourceTests/TestCompletePageIssue-11.cs @@ -0,0 +1,51 @@ +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace TpsParser.Tests.ResourceTests; + +internal sealed class TestCompletePageIssue_11 +{ + [Test] + [Description("Issue #11 - IsCompletePage address check should read an Int32BE, not Int32LE.")] + public void ShouldReadCompletePages() + { + using var fs = new FileStream("Resources/CompletePageIssue-11.tps", FileMode.Open, FileAccess.Read); + + var tpsFile = new TpsFile(fs); + + IEnumerable? blocks = null; + + Assert.DoesNotThrow(() => + { + blocks = tpsFile.GetBlocks(); + }); + + if (blocks is null) + { + Assert.Fail(); + return; + } + + var singleBlock = blocks.Single(); + + var pages = singleBlock.GetPages(); + + var singlePage = pages.Single(); + + using (Assert.EnterMultipleScope()) + { + Assert.That(singlePage.AbsoluteAddress, Is.EqualTo(512)); + Assert.That(singlePage.Flags, Is.Zero); + Assert.That(singlePage.RecordCount, Is.EqualTo(9)); + Assert.That(singlePage.Size, Is.EqualTo(1526)); + Assert.That(singlePage.SizeUncompressed, Is.EqualTo(2119)); + Assert.That(singlePage.SizeUncompressedExpanded, Is.EqualTo(2161)); + + var records = singlePage.GetRecords(tpsFile.ErrorHandlingOptions); + + Assert.That(records, Has.Count.EqualTo(9)); + } + } +} diff --git a/tests/TpsParser.Tests/Resources/CompletePageIssue-11.tps b/tests/TpsParser.Tests/Resources/CompletePageIssue-11.tps new file mode 100644 index 0000000000000000000000000000000000000000..8a2b7184be174fd0951c18e45ea8d4dce3d92e0b GIT binary patch literal 2048 zcmd^CiGMOnYU6{7C6m10scYy)|E|8hLPGcv@ILTP6;)Z1h3luj5WnWZ4 zSrl1X76la)6<0v3RzYRocNcIM6p)Hk(EHwG+BrR^{sEYCa&z+g?tM4+-J1u1mjE8L zc$b@H788Jo{PEvLMtr{Aja7WU)fuY?dk;0PfMaK4~1zrO+`%tsn#V)T=3C=W~hoyxy~YFPd%_TJq84j zk~pA-8t0EIr^e(sZwcgdE;CKl3JRR%T|lz9t^|vf5(`zrXVaU_RV(7t728I!6lFKJ z-ccOsR5zLbDGcy%ONI%oB*Qd95noVO!bQ$<2|&s@vZ!TgrV)plfOmKl`3tEU2~xfx z8JH{)n3bn+YHNl~qgw@#1Y{~#Lt#@7MRoSoO+lW<^)S_O596v&1~S7TA!^$tA-0Ju zBn8OKdVo8rQ@hY)i5N`U+XhAb2IXVk zOm4l~8{iHOZXU(5$l7JsMdv#>D~h`|z#Sc&9mNA1;7$&15ycf8D~4g>H)GF{Zgm6X za0`TGE}|va?Mwo$oY;H)^vfbfumjee8-rmQqPUh309nG$v44X($dje&iINPp_(}v( za>;H_LX*U#rpYO(Y0bRp8JW$qvRmY|yx_vzyo*}3zW9q>gsFSweOJM zu~X-3yL9b#-Ss!z*u971^Q*KVP^jHh6x0nfbaU9UBexXaT5{X%cl5mTuDkEKx7U58 zz5Dd-*MGpkL4)rv8!~iQ`S1rGeCXjvMm#!l)MJm29y4~__z4pyO`h_^lTS^ZHvQ>m zX3U&5``PE_JU@5d`~?-23l}Y3^1_Qtm%a4zE6Z2B`r69Z-*|J?TW`Pf?tAaAUbFUt z534@<_><~SKU=r{^Dn;KuyNDoEnBy3-?4Mo?mc_=?LTnv&{to7^X=gy-+lkXk3aqV z%dba|{r3Cu6DR*TRrBZRzs}VDefHcx|NHuT