Go library for ISO8583 message packing/unpacking, dynamic JSON packager loading, and BER-TLV handling (including DE55 workflows).
This development is inspired by jPOS: https://github.com/jpos/jPOS
Looking for in-depth docs? See the project knowledge base in
docs/— architecture, packager internals, field-packager catalog, TLV/DE55 guide, cookbook, testing, and a glossary.
go get github.com/sachingimhan/go8583@latestimport iso8583 "github.com/sachingimhan/go8583"Then run:
go mod tidy- Build ISO8583 messages with
ISOMsg - Pack/unpack using
BasePackageror JSON-driven packagers - Support for ASCII, BCD, binary, EBCDIC, bitmap, amount, and subfield formats
- BER-TLV encode/decode utilities
TLVListAPI for DE55 build, parse, search, update, and serialize
Sample JSON packager definitions used by tests are in:
testdata/packagers/cup_packager.jsontestdata/packagers/visa_packager.jsontestdata/packagers/mastercard_packager.json
jsonCfg := `{
"fields": [
{"id": 0, "length": 4, "name": "MTI", "class": "IFA_NUMERIC"},
{"id": 1, "length": 16, "name": "BITMAP", "class": "IFA_BITMAP"},
{"id": 2, "length": 19, "name": "PAN", "class": "IFA_LLCHAR"},
{"id": 3, "length": 6, "name": "PROC", "class": "IFA_NUMERIC"},
{"id": 4, "length": 12, "name": "AMOUNT", "class": "IFA_NUMERIC"}
]
}`
p, _ := iso8583.NewGenericPackagerFromReader(strings.NewReader(jsonCfg))
m := iso8583.NewISOMsg()
m.Set(0, "0200")
m.Set(2, "4567890123456789")
m.Set(3, "000000")
m.Set(4, "1000")
raw, _ := p.Pack(m)
out := iso8583.NewISOMsg()
_, _ = p.Unpack(out, raw)tl := iso8583.NewTLVList()
_ = tl.AppendHex(0x9F02, "000000159500")
_ = tl.AppendHex(0x5F2A, "0144")
_ = tl.AppendHex(0x9F1A, "0144")
de55, _ := tl.Pack()
parsed, _ := iso8583.ParseTLVList(de55)
for _, item := range parsed.Elements() {
fmt.Printf("Tag: %X Value: %s\n", item.GetTag(), item.GetStringValue())
}ISOMsg:
NewISOMsg() *ISOMsg(m *ISOMsg) Set(id any, val any)(m *ISOMsg) SetMTI(val string)(m *ISOMsg) Get(id any) ISOComponent(m *ISOMsg) GetString(id any) string(m *ISOMsg) GetBytes(id any) []byte(m *ISOMsg) HasField(id any) bool(m *ISOMsg) Pack() ([]byte, error)(m *ISOMsg) Unpack(data []byte) (int, error)(m *ISOMsg) GetValue() any
ISOField:
(f *ISOField) Pack() ([]byte, error)(f *ISOField) Unpack(data []byte) (int, error)(f *ISOField) GetValue() any
Interfaces:
ISOComponentISOPackagerISOFieldPackager
NewGenericPackager(path string) (*BasePackager, error)NewGenericPackagerFromReader(r io.Reader) (*BasePackager, error)NewGenericPackagerFromConfig(config *PackagerConfig) (*BasePackager, error)
BasePackager methods:
(p *BasePackager) Pack(m *ISOMsg) ([]byte, error)(p *BasePackager) Unpack(m *ISOMsg, data []byte) (int, error)(p *BasePackager) PackField(fld int, value any) ([]byte, error)(p *BasePackager) UnpackField(fld int, data []byte, offset int) (any, int, error)(p *BasePackager) GetFieldPackager(fld int) ISOFieldPackager(p *BasePackager) GetLength() int
Config structs:
type PackagerConfig struct { Fields []FieldConfig }type FieldConfig struct { ID, Length, Name, Class, Fields, Packager }
Registry:
var PackagerRegistry map[string]func(int) ISOFieldPackager
ASCII/EBCDIC/BCD/Binary constructors:
NewIFANumericNewIFALLCharNewIFA_LLNUMNewIFA_LLLNUMNewIFA_LLLCHARNewIFB_NUMERICNewIFB_LLNUMNewIFB_LLLNUMNewIFB_LLHNUMNewIFB_LLCHARNewIFB_LLLCHARNewIFB_LLHCHARNewIFB_LLHECHARNewIFB_LLHBINARYNewIFB_LLLHBINARYNewIFB_LLLBINARYNewIFB_LLLLBINARYNewIFB_BINARYNewIFB_AMOUNTNewIFB_LL_HEX_NUMERICNewIFA_BINARYNewIFA_LLLBINARYNewIFA_AMOUNTNewIFE_NUMERICNewIFE_CHARNewIFE_LLCHARNewIFE_LLNUMNewIFE_LLLCHARNewIFE_LLLBINARYNewIFE_AMOUNTNewIF_CHARNewIF_ECHARNewIFMC_LLCHARNewIFMC_LLLCHAR
Bitmap/subfield/TLV constructors:
NewIFB_LLH_SUBPACKAGERNewIFA_LLLTLVNewIFB_LLHTLV
Special packager types:
IFABitmapIFB_BITMAPIF_NOPBase1_BITMAP126BCDSubFieldPackagerTLVFieldPackagerISOStringFieldPackager
Single TLV item:
NewTLV(tag int, value []byte) (TLV, error)NewTLVWithFormat(tag int, value []byte, tagSize int, lengthSize int) (TLV, error)(t TLV) GetTag() int(t TLV) GetValue() []byte(t TLV) GetTLV() ([]byte, error)(t TLV) GetTLVWithFormat(tagSize int, lengthSize int) ([]byte, error)(t TLV) GetL() ([]byte, error)(t TLV) GetLWithSize(lengthSize int) ([]byte, error)(t TLV) GetStringValue() string(t TLV) IsPrimitive() bool(t TLV) String() string
TLV encode/decode helpers:
PackTLVPackTLVWithFormatPackTLVsPackTLVsWithFormatUnpackTLVUnpackTLVWithFormatUnpackTLVsUnpackTLVsWithFormatParseTLVHexEncodeTLVHexFindTLVByTagFindTLVValueByTagGetTLVTagsGetTLVValues
TLV list API (TLVList):
CreateTLVListBuilder() *TLVListBuilderNewTLVList() *TLVListNewTLVListWithFormat(tagSize int, lengthSize int) (*TLVList, error)NewTLVListFromTLVs(tags []TLV) *TLVListParseTLVList(buf []byte) (*TLVList, error)ParseTLVListWithFormat(buf []byte, tagSize int, lengthSize int) (*TLVList, error)(tl *TLVList) Unpack(buf []byte) error(tl *TLVList) UnpackOffset(buf []byte, offset int) error(tl *TLVList) Pack() ([]byte, error)(tl *TLVList) Append(tag int, value []byte) error(tl *TLVList) AppendHex(tag int, value string) error(tl *TLVList) AppendTLV(tlv TLV) error(tl *TLVList) GetTags() []TLV(tl *TLVList) Elements() []TLV(tl *TLVList) Find(tag int) (TLV, bool)(tl *TLVList) FindIndex(tag int) int(tl *TLVList) FindNextTLV() (TLV, bool, error)(tl *TLVList) Index(index int) (TLV, error)(tl *TLVList) GetValue(tag int) ([]byte, bool)(tl *TLVList) GetString(tag int) (string, bool)(tl *TLVList) HasTag(tag int) bool(tl *TLVList) DeleteByIndex(index int) error(tl *TLVList) DeleteByTag(tag int)(tl *TLVList) Len() int(tl *TLVList) Dump(w io.Writer, indent string)
TLVListBuilder:
(b *TLVListBuilder) FixedTagSize(tagSize int) *TLVListBuilder(b *TLVListBuilder) FixedLengthSize(lengthSize int) *TLVListBuilder(b *TLVListBuilder) Build() (*TLVList, error)
Interpreters:
AsciiInterpreterBcdInterpreterEbcdicInterpreterBinaryInterpreter
Prefixers:
AsciiPrefixerBcdPrefixerBinaryPrefixerEbcdicPrefixer
Padders:
LeftPadderRightPadder
Interfaces:
InterpreterPrefixerPadder
ISOUtil methods:
(u ISOUtil) AsciiToEbcdic(ascii string) []byte(u ISOUtil) EbcdicToAscii(ebcdic []byte) string(u ISOUtil) HexToBytes(h string) ([]byte, error)(u ISOUtil) BytesToHex(b []byte) string(u ISOUtil) ZeroPad(s string, length int) string(u ISOUtil) SpacePad(s string, length int) string(u ISOUtil) StrToHex(s string) string(u ISOUtil) HexToStr(h string) (string, error)(u ISOUtil) StrToBCD(s string) []byte(u ISOUtil) BCDToStr(b []byte) string
These class values are available in PackagerRegistry:
IFA_NUMERICIFA_LLCHARIFA_BITMAPIFB_NUMERICIFB_LLNUMIFB_BITMAPIFA_LLNUMIFA_LLLCHARIFB_LLLNUMIFE_NUMERICIFE_CHARIFE_LLCHARIFE_LLNUMIFE_LLLCHARIFA_BINARYIFB_BINARYIF_CHARIFA_AMOUNTIFE_AMOUNTIFB_AMOUNTIFB_LLHNUMIFB_LLHCHARIFB_LLLHBINARYIFB_LLHECHARIFB_LLHBINARYIFB_LLCHARIFMC_LLCHARIFMC_LLLCHARIFE_LLLBINARYIFB_LLLCHARIF_ECHARIFB_LL_HEX_NUMERICIFA_LLLBINARYIFB_LLLBINARYIFB_LLLLBINARYIFA_LLLTLVIFB_LLHTLVTLVIFA_LLLNUMIF_NOPBase1_BITMAP126
Run all tests:
go test ./...Run TLV-focused tests:
go test ./... -run "TestTLV|TestTLVList|TestPrintAllTagsAndValuesFromUnpackedTLV" -v