All notable changes to TagDataTranslation will be documented in this file.
Fixes found while reviewing the TDT 2.3 public review draft (September 2026).
Breaking: binary output changes for URN Code 40 values and hostnames, CPI++, SGCN++ and GDTI-113 (the old output did not follow TDS 2.3), and input that used to be accepted now throws (see Changed).
- URN Code 40 now follows TDS 2.3 table 14-8 (PAD, A-Z,
-,.,:, 0-9) and the+1offset, for both variable-length alphanumeric values and '++' hostnames. Lowercase values are no longer upper-cased (which was lossy). Changes binary output. - CPI++ and SGCN++ encode the serial as a TDS 14.5.13 numeric string (unsigned integer of ceil(L·log2 10) bits) instead of BCD, and now match the TDS 2.3 E.3 vectors. Changes binary output.
- GDTI-113 encodes the serial with the TDS 14.3.6 "Numeric String" method, preserving leading zeros. Changes binary output.
- Delimited/terminated numeric (TDS 14.5.5): all-numeric values end with the
1111terminator, and the decoder honours the encoding indicator after the1110delimiter. - Variable-length integer bit counts are exact;
3.32 bits/digitwas wrong for 25, 28, 50 and more digits. - GRAI-96 BARE_IDENTIFIER pattern reverted to
{14,25}; the{15,26}change rejected 1-digit serials and split 26-digit inputs one position off. - A GS1 Digital Link on
id.gs1.orgselects the '+' scheme instead of the '++' scheme, so '+' binary round-trips through Digital Link. - Digital Link query-string AIs and extra GS1_AI_JSON members are encoded as +AIDC data; the data toggle follows the data, and
dataToggle=1without +AIDC data is rejected. - GS1_AI_JSON output is built from the scheme grammar (with JSON escaping and +AIDC members) instead of a hard-coded AI map that dropped AIs for SGTIN-96, SGLN, GRAI, GDTI, CPI, DSGTIN+ and others. '++' schemes now have a GS1_AI_JSON level.
- SGLN schemes support
valueIfNulland conditional[...]grammar (TDT 3.2/3.9): a missing GLN extension encodes as0, and0is omitted from bare identifier, GS1_AI_JSON and Digital Link output. - A raw
"is no longer accepted in Digital Link URIs;%22is (RFC 3986). - Scheme fixes: CPI-var (
]]character set, 12-digit pure-identity serial, GS1_AI_JSON grammar field), CPI-96/CPI-var duplicate fieldseq, CPI-96 serial maximum, ADI-var (TEI/SERgrammar, URN-escaped character sets, CAGE sub-pattern), GIAI-202 Digital Link encode rule, USDOD-96 two-digit filter, unbalanced character-set regexes in 8 '+'/'++' files.
- Stricter validation at the trust boundary. The engine now throws instead of continuing silently when:
- a GS1 check digit is wrong (
TDTInvalidCheckDigit); - a scheme character set is an invalid regex or a rule function is unknown (
TDTInvalidSchemeDefinition); - a grammar field has no value, including a missing '++' hostname or serial (
TDTUndefinedField); - a value does not fit its binary field (
TDTNumericOverflow); - a value is not numeric, or a pre-TDS 2.0 integer serial has leading zeros (
TDTFieldOutsideCharacterSet).
- a GS1 check digit is wrong (
- Input validation for
BinaryConverterandCode40decoder
- README: added platform badges, removed
tagLengthfrom decode examples, improved discoverability
- README improvements for NuGet and npm discoverability
- Exclude
.js.symbolsfile from npm package to prevent MONO_WASM warning
- +AIDC data encoding/decoding support (TDS 2.3 §15.3)
- Decode +AIDC data when
dataToggle=1(case-sensitivity bug) - WASM trimmer for
RuntimeInformation
- npm smoke test and iOS commit step in CI
- npm and iOS CI workflow failures
- CI workflow fixes and AOT-safe JSON serialization
- Cross-platform SDKs: npm (WASM), Python (pythonnet), Swift (NativeAOT), Android (NativeAOT), Flutter (dart:ffi)
- .NET MAUI target frameworks: Android, iOS, macCatalyst
LoadErrorsproperty for debugging scheme loading failuresInternalsVisibleTofor test project access- Performance benchmarks project (BenchmarkDotNet)
- Python example app
- Node.js example app
- PyPI publish workflow
- pub.dev publish workflow
- License changed to Business Source License 1.1 (BSL 1.1)
- Performance optimizations: regex caching, grammar token caching, pre-sorted fields/rules, BinaryConverter lookup tables
- README updated with all platform availability and benchmark results
- WASM build error (missing
using System,SupportedOSPlatformattribute) - Android managed publish pipeline (DLLs not copied to output directory)
- Android native build script (NDK lld linker auto-detection)
- Nullable warnings in Android and WASM wrappers
- npm release workflow using .NET 8.0 instead of 10.0
- TDS 2.3 support with 12 new '++' schemes for custom hostname encoding in Digital Link URIs
- SGTIN++, SSCC++, SGLN++, GRAI++, GIAI++, GSRN++, GSRNP++, GDTI++, SGCN++, ITIP++, CPI++, DSGTIN++
- Hostname encoding with Code 40 and 7-bit ASCII optimization tables
- Variable-length alphanumeric encoding (Section 14.5.6)
TryTranslateandTryTranslateDetailsfor exception-free high-throughput translation
- Multi-targeting support for .NET 8.0, 9.0, and 10.0
- TDT 2.2 with JSON-based scheme definitions
- GS1 Digital Link URI generation and parsing
- New schemes: DSGTIN+, GDTI-113, and more
- GS1 Company Prefix lookup
- Filter Value tables
- Scheme definitions migrated from XML to JSON
- Updated GCP prefix file
- ITIP encoding fixes
- Initial release with TDT 1.6/1.11 support
- Core translation engine
- SGTIN-96, SSCC-96, SGLN, GRAI, GIAI, GSRN, GDTI, SGCN schemes