{"id":37168152,"url":"https://github.com/thought-machine/iso8583","last_synced_at":"2026-01-14T19:52:50.601Z","repository":{"id":45654384,"uuid":"376894012","full_name":"thought-machine/iso8583","owner":"thought-machine","description":"A golang implementation to marshal and unmarshal iso8583 message.","archived":false,"fork":true,"pushed_at":"2024-07-15T16:24:40.000Z","size":1260,"stargazers_count":0,"open_issues_count":2,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-07-15T20:03:27.948Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://moov.io","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"moov-io/iso8583","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thought-machine.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null}},"created_at":"2021-06-14T16:48:51.000Z","updated_at":"2024-07-15T16:24:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/thought-machine/iso8583","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/thought-machine/iso8583","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thought-machine%2Fiso8583","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thought-machine%2Fiso8583/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thought-machine%2Fiso8583/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thought-machine%2Fiso8583/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thought-machine","download_url":"https://codeload.github.com/thought-machine/iso8583/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thought-machine%2Fiso8583/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28433407,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T18:57:19.464Z","status":"ssl_error","status_checked_at":"2026-01-14T18:52:48.501Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T19:52:49.773Z","updated_at":"2026-01-14T19:52:50.584Z","avatar_url":"https://github.com/thought-machine.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Moov Banner Logo](https://user-images.githubusercontent.com/20115216/104214617-885b3c80-53ec-11eb-8ce0-9fc745fb5bfc.png)](https://github.com/moov-io)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/moov-io/iso8583/tree/master/docs\"\u003eProject Documentation\u003c/a\u003e\n  ·\n  \u003ca href=\"https://slack.moov.io/\"\u003eCommunity\u003c/a\u003e\n  ·\n  \u003ca href=\"https://moov.io/blog/\"\u003eBlog\u003c/a\u003e\n  \u003cbr\u003e\n  \u003cbr\u003e\n\u003c/p\u003e\n\n[![GoDoc](https://godoc.org/github.com/moov-io/iso8583?status.svg)](https://godoc.org/github.com/moov-io/iso8583)\n[![Build Status](https://github.com/moov-io/iso8583/workflows/Go/badge.svg)](https://github.com/moov-io/iso8583/actions)\n[![Coverage Status](https://codecov.io/gh/moov-io/iso8583/branch/master/graph/badge.svg)](https://codecov.io/gh/moov-io/iso8583)\n[![Go Report Card](https://goreportcard.com/badge/github.com/moov-io/iso8583)](https://goreportcard.com/report/github.com/moov-io/iso8583)\n[![Repo Size](https://img.shields.io/github/languages/code-size/moov-io/iso8583?label=project%20size)](https://github.com/moov-io/iso8583)\n[![Apache 2 License](https://img.shields.io/badge/license-Apache2-blue.svg)](https://raw.githubusercontent.com/moov-io/iso8583/master/LICENSE)\n[![Slack Channel](https://slack.moov.io/badge.svg?bg=e01563\u0026fgColor=fffff)](https://slack.moov.io/)\n[![GitHub Stars](https://img.shields.io/github/stars/moov-io/iso8583)](https://github.com/moov-io/iso8583)\n[![Twitter](https://img.shields.io/twitter/follow/moov?style=social)](https://twitter.com/moov?lang=en)\n\n# moov-io/iso8583\n\nMoov's mission is to give developers an easy way to create and integrate bank processing into their own software products. Our open source projects are each focused on solving a single responsibility in financial services and designed around performance, scalability, and ease of use.\n\nISO8583 implements an ISO 8583 message reader and writer in Go. ISO 8583 is an international standard for card-originated financial transaction messages that defines both message format and communication flow. It's used by major card networks around the globe including Visa, Mastercard, and Verve. The standard supports card purchases, withdrawals, deposits, refunds, reversals, balance inquiries, inter-account transfers, administrative messages, secure key exchanges, and more.\n\n## Table of contents\n\n- [Project status](#project-status)\n- [Go module](#go-library)\n- [Go version support policy](#go-version-support-policy)\n- [How to](#how-to)\n\t- [Define specification](#define-your-specification)\n\t- [Build message](#build-and-pack-the-message)\n\t- [Parse message](#parse-the-message-and-access-the-data)\n\t- [Inspect message fields](#inspect-message-fields)\n\t- [Encode/Decode from/to JSON](#json-encoding)\n- [ISO8583 CLI](#cli)\n- [Learn about ISO 8583](#learn-about-iso-8583)\n- [Getting help](#getting-help)\n- [Contributing](#contributing)\n- [Related projects](#related-projects)\n\n## Project status\n\nMoov ISO8583 is a Go package that's been **thoroughly tested and trusted in the real world**. The project has proven its reliability and robustness in real-world, high-stakes scenarios. Please let us know if you encounter any missing feature/bugs/unclear documentation by opening up [an issue](https://github.com/moov-io/iso8583/issues/new). Thanks!\n\n## Go library\n\nThis project uses [Go Modules](https://go.dev/blog/using-go-modules). See [Golang's install instructions](https://golang.org/doc/install) for help in setting up Go. You can download the source code and we offer [tagged and released versions](https://github.com/moov-io/iso8583/releases/latest) as well. We highly recommend you use a tagged release for production.\n\n## Go version support policy\n\n### Always up-to-date, never left behind\n\nWhile we strive to embrace the latest language enhancements, we also appreciate the need for a certain degree of backward compatibility. We understand that not everyone can update to the latest version immediately. Our philosophy is to move forward and embrace the new, but without leaving anyone immediately behind.\n\n#### Which versions do we support now?\n\nAs of today, we are supporting the following versions as referenced in the [setup-go action step](https://github.com/actions/setup-go#using-stableoldstable-aliases):\n\n* `stable` (which points to the current Go version)\n* `oldstable` (which points to the previous Go version)\n\nThe [setup-go](https://github.com/actions/setup-go) action automatically manages versioning, allowing us to always stay aligned with the latest and preceding Go releases.\n\n#### What does this mean for you?\n\nWhenever a new version of Go is released, we will update our systems and ensure that our project remains fully compatible with it. At the same time, we will continue to support the previous version. However, once a new version is released, the 'previous previous' version will no longer be officially supported. \n\n#### Continuous integration\n\nTo ensure our promise of support for these versions, we've configured our GitHub CI actions to test our code with both the current and previous versions of Go. This means you can feel confident that the project will work as expected if you're using either of these versions.\n\n### Installation\n\n```\ngo get github.com/moov-io/iso8583\n```\n\n## How to\n\n### Define your specification\n\nCurrently, we have defined the following ISO 8583 specifications:\n\n* [Spec87ASCII](./specs/spec87ascii.go) - 1987 version of the spec with ASCII encoding\n* [Spec87Hex](./specs/spec87hex.go) - 1987 version of the spec with Hex encoding\n\nSpec87ASCII is suitable for the majority of use cases. Simply instantiate a new message using `specs.Spec87ASCII`:\n\n```\nisomessage := iso8583.NewMessage(specs.Spec87ASCII)\n```\nIf this spec does not meet your needs, we encourage you to modify it or create your own using the information below.\n\nFirst, you need to define the format of the message fields that are described in your ISO8583 specification. Each data field has a type and its own spec. You can create a `NewBitmap`, `NewString`, or `NewNumeric` field. Each individual field spec consists of a few elements:\n\n| Element          | Notes                                                                                                                                                                                                                       | Example                    |\n|------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------|\n| `Length`         | Maximum length of field (bytes, characters or digits), for both fixed and variable lengths.                                                                                                                                 | `10`                       |\n| `Description`    | Describes what the data field holds.                                                                                                                                                                                        | `\"Primary Account Number\"` |\n| `Enc`            | Sets the encoding type (`ASCII`, `Hex`, `Binary`, `BCD`, `LBCD`, `EBCDIC`).                                                                                                                                                           | `encoding.ASCII`           |\n| `Pref`           | Sets the encoding (`ASCII`, `Hex`, `Binary`, `BCD`, `EBCDIC`) of the field length and its type as fixed or variable (`Fixed`, `L`, `LL`, `LLL`, `LLLL`). The number of 'L's corresponds to the number of digits in a variable length. | `prefix.ASCII.Fixed`       |\n| `Pad` (optional) | Sets padding direction and type.                                                                                                                                                                                            | `padding.Left('0')`        |\n\nWhile some ISO8583 specifications do not have field 0 and field 1, we use them for MTI and Bitmap. Because technically speaking, they are just regular fields. We use field specs to describe MTI and Bitmap too. We currently use the `String` field for MTI, while we have a separate `Bitmap` field for the bitmap.\n\nThe following example creates a full specification with three individual fields (excluding MTI and Bitmap):\n\n```go\nspec := \u0026iso8583.MessageSpec{\n\tFields: map[int]field.Field{\n\t\t0: field.NewString(\u0026field.Spec{\n\t\t\tLength:      4,\n\t\t\tDescription: \"Message Type Indicator\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t}),\n\t\t1: field.NewBitmap(\u0026field.Spec{\n\t\t\tDescription: \"Bitmap\",\n\t\t\tEnc:         encoding.Hex,\n\t\t\tPref:        prefix.Hex.Fixed,\n\t\t}),\n\n\t\t// Message fields:\n\t\t2: field.NewString(\u0026field.Spec{\n\t\t\tLength:      19,\n\t\t\tDescription: \"Primary Account Number\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.LL,\n\t\t}),\n\t\t3: field.NewNumeric(\u0026field.Spec{\n\t\t\tLength:      6,\n\t\t\tDescription: \"Processing Code\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t\tPad:         padding.Left('0'),\n\t\t}),\n\t\t4: field.NewString(\u0026field.Spec{\n\t\t\tLength:      12,\n\t\t\tDescription: \"Transaction Amount\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t\tPad:         padding.Left('0'),\n\t\t}),\n\t},\n}\n```\n\nThe following example creates a full specification with three individual fields (excluding MTI and Bitmap). It differs from the example above, by [showing the expandability of the bitmap field](https://github.com/moov-io/iso8583/blob/5b24f23a5a02206d59baa033ed040f79478b6ecb/field/bitmap.go#L94-L109). This is useful for specs that define both a primary and secondary bitmap.\n\n```go\nspec := \u0026iso8583.MessageSpec{\n\tFields: map[int]field.Field{\n\t\t0: field.NewString(\u0026field.Spec{\n\t\t\tLength:      4,\n\t\t\tDescription: \"Message Type Indicator\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t}),\n\t\t1: field.NewBitmap(\u0026field.Spec{\n\t\t\tDescription: \"Bitmap\",\n\t\t\tEnc:         encoding.Hex,\n\t\t\tPref:        prefix.Hex.Fixed,\n\t\t}),\n\n\t\t// Message fields:\n\t\t2: field.NewString(\u0026field.Spec{\n\t\t\tLength:      19,\n\t\t\tDescription: \"Primary Account Number\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.LL,\n\t\t}),\n\t\t3: field.NewNumeric(\u0026field.Spec{\n\t\t\tLength:      6,\n\t\t\tDescription: \"Processing Code\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t\tPad:         padding.Left('0'),\n\t\t}),\n\t\t4: field.NewString(\u0026field.Spec{\n\t\t\tLength:      12,\n\t\t\tDescription: \"Transaction Amount\",\n\t\t\tEnc:         encoding.ASCII,\n\t\t\tPref:        prefix.ASCII.Fixed,\n\t\t\tPad:         padding.Left('0'),\n\t\t}),\n        // Pulled from the 1993 spec\n        67: field.NewNumeric(\u0026field.Spec{\n            Length: 2,\n            Description: \"Extended Payment Data\",\n            Enc: encoding.ASCII,\n            Pref: prefix.ASCII.Fixed,\n            Pad: padding.Left('0'),\n        }),\n\t},\n}\n```\n\n### Build and pack the message\n\nAfter the specification is defined, you can build a message. Having a binary representation of your message that's packed according to the provided spec lets you send it directly to a payment system!\n\nNotice in the examples below, you do not need to set the bitmap value manually, as it is automatically generated for you during packing.\n\n#### Setting values of individual fields\n\nIf you need to set few fields, you can easily set them using `message.Field(id, string)` or `message.BinaryField(id, []byte)` like this:\n\n```go\n// create message with defined spec\nmessage := NewMessage(spec)\n\n// set message type indicator at field 0\nmessage.MTI(\"0100\")\n\n// set all message fields you need as strings\n\nerr := message.Field(2, \"4242424242424242\")\n// handle error\n\nerr = message.Field(3, \"123456\")\n// handle error\n\nerr = message.Field(4, \"100\")\n// handle error\n\n// generate binary representation of the message into rawMessage\nrawMessage, err := message.Pack()\n\n// now you can send rawMessage over the wire\n```\n\nWorking with individual fields is limited to two types: `string` or `[]byte`. Underlying field converts the input into its own type. If it fails, then error is returned.\n\n#### Setting values using data struct\n\nAccessing individual fields is handy when you want to get value of one or two fields. When you need to access a lot of them and you want to work with field types, using structs with `message.Marshal(data)` is more convenient.\n\nFirst, you need to define a struct with fields you want to set. Fields should correspond to the spec field types. Here is an example:\n\n```go\n// list fields you want to set, add `index` tag with field index or tag (for\n// composite subfields) use the same types from message specification\ntype NetworkManagementRequest struct {\n\tMTI                  *field.String `index:\"0\"`\n\tTransmissionDateTime *field.String `index:\"7\"`\n\tSTAN                 *field.String `index:\"11\"`\n\tInformationCode      *field.String `index:\"70\"`\n}\n\nmessage := NewMessage(spec)\n\n// now, pass data with fields into the message\nerr := message.Marshal(\u0026NetworkManagementRequest{\n\tMTI:                  field.NewStringValue(\"0800\"),\n\tTransmissionDateTime: field.NewStringValue(time.Now().UTC().Format(\"060102150405\")),\n\tSTAN:                 field.NewStringValue(\"000001\"),\n\tInformationCode:      field.NewStringValue(\"001\"),\n})\n\n// pack the message and send it to your provider\nrequestMessage, err := message.Pack()\n```\n\n### Parse the message and access the data\n\nWhen you have a binary (packed) message and you know the specification it follows, you can unpack it and access the data. Again, you have two options for data access: access individual fields or populate struct with message field values.\n\n#### Getting values of individual fields\n\nYou can access values of individual fields using `message.GetString(id)`, `message.GetBytes(id)` like this:\n\n```go\nmessage := NewMessage(spec)\nmessage.Unpack(rawMessage)\n\nmti, err := message.GetMTI() // MTI: 0100\n// handle error\n\npan, err := message.GetString(2) // Card number: 4242424242424242\n// handle error\n\nprocessingCode, err := message.GetString(3) // Processing code: 123456\n// handle error\n\namount, err := message.GetString(4) // Transaction amount: 100\n// handle error\n```\n\nAgain, you are limited to a `string` or a `[]byte` types when you get values of individual fields.\n\n#### Getting values using data struct\n\nTo get values of multiple fields with their types just pass a pointer to a struct for the data you want into `message.Unmarshal(data)` like this:\n\n```go\n// list fields you want to set, add `index` tag with field index or tag (for\n// composite subfields) use the same types from message specification\ntype NetworkManagementRequest struct {\n\tMTI                  *field.String `index:\"0\"`\n\tTransmissionDateTime *field.String `index:\"7\"`\n\tSTAN                 *field.String `index:\"11\"`\n\tInformationCode      *field.String `index:\"70\"`\n}\n\nmessage := NewMessage(spec)\n// let's unpack binary message\nerr := message.Unpack(rawMessage)\n// handle error\n\n// create pointer to empty struct\ndata := \u0026NetworkManagementRequest{}\n\n// get field values into data struct\nerr = message.Unmarshal(data)\n// handle error\n\n// now you can access field values\ndata.MTI.Value() // \"0100\"\ndata.TransmissionDateTime.Value() // \"220102103212\"\ndata.STAN.Value() // \"000001\"\ndata.InformationCode.Value() // \"001\"\n```\n\nFor complete code samples please check [./message_test.go](./message_test.go).\n\n### Inspect message fields\n\nThere is a `Describe` function in the package that displays all message fields\nin a human-readable way. Here is an example of how you can print message fields\nwith their values to STDOUT:\n\n```go\n// print message to os.Stdout\niso8583.Describe(message, os.Stdout)\n```\n\nand it will produce the following output:\n\n```\nMTI........................................: 0100\nBitmap.....................................: 000000000000000000000000000000000000000000000000\nBitmap bits................................: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000\nF000 Message Type Indicator................: 0100\nF002 Primary Account Number................: 4242****4242\nF003 Processing Code.......................: 123456\nF004 Transaction Amount....................: 100\nF020 PAN Extended Country Code.............: 4242****4242\nF035 Track 2 Data..........................: 4000****0506=2512111123400001230\nF036 Track 3 Data..........................: 011234****3445=724724000000000****00300XXXX020200099010=********************==1=100000000000000000**\nF045 Track 1 Data..........................: B4815****1896^YATES/EUGENE L^^^356858      00998000000\nF052 PIN Data..............................: 12****78\nF055 ICC Data – EMV Having Multiple Tags...: ICC  ... Tags\n```\n\nby default, we apply `iso8583.DefaultFilters` to mask the values of the fields\nwith sensitive data. You can define your filter functions and redact specific\nfields like this:\n\n```go\nfilterAll = func(in string, data field.Field) string {\n\trunesInString := utf8.RuneCountInString(in)\n\n\treturn strings.Repeat(\"*\", runesInString)\n}\n\n// filter only value of the field 2\niso8583.Describe(message, os.Stdout, filterAll(2, filterAll))\n\n// outputs:\n// F002 Primary Account Number................: ************\n```\n\nIf you want to view unfiltered values, you can use no-op filters `iso8583.DoNotFilterFields` that we defined:\n\n```go\n// display unfiltered field values\niso8583.Describe(message, os.Stdout, DoNotFilterFields()...)\n```\n\n### JSON encoding\n\nYou can serialize message into JSON format:\n\n```go\nmessage := iso8583.NewMessage(spec)\nmessage.MTI(\"0100\")\nmessage.Field(2, \"4242424242424242\")\nmessage.Field(3, \"123456\")\nmessage.Field(4, \"100\")\n\njsonMessage, err := json.Marshal(message)\n```\n\nit will produce the following JSON (bitmap is not included, as it's only used to unpack message from the binary representation):\n\n```json\n{\n   \"0\":\"0100\",\n   \"2\":\"4242424242424242\",\n   \"3\":123456,\n   \"4\":\"100\"\n}\n```\n\nAlso, you can unmarshal JSON into `iso8583.Message`:\n\n```go\ninput := `{\"0\":\"0100\",\"2\":\"4242424242424242\",\"4\":\"100\"}`\n\nmessage := NewMessage(spec)\nif err := json.Unmarshal([]byte(input), message); err != nil {\n    // handle err\n}\n\n// access indidual fields or using struct\n```\n\n### Network Header\n\nAll messages between the client/server (ISO host and endpoint) have a message\nlength header. It can be a 4 bytes ASCII or 2 bytes BCD encoded length. We\nprovide a `network.Header` interface to simplify the reading and writing of the\nnetwork header.\n\nFollowing network headers are supported:\n\n* Binary2Bytes - message length encoded in 2 bytes, e.g, {0x00 0x73} for 115\n  bytes of the message\n* ASCII4Bytes - message length encoded in 4 bytes ASCII, e.g., 0115 for 115\n  bytes of the message\n* BCD2Bytes - message length encoded in 2 bytes BCD, e.g, {0x01, 0x15} for 115\n  bytes of the message\n* VMLH (Visa Message Length Header) - message length encoded in 2 bytes + 2 reserved bytes\n\nYou can read network header from the network connection like this:\n\n```go\nheader := network.NewBCD2BytesHeader()\n_, err := header.ReadFrom(conn)\nif err != nil {\n\t// handle error\n}\n\n// Make a buffer to hold message\nbuf := make([]byte, header.Length())\n// Read the incoming message into the buffer.\nread, err := io.ReadFull(conn, buf)\nif err != nil {\n\t// handle error\n}\nif reqLen != header.Length() {\n\t// handle error\n}\n\nmessage := iso8583.NewMessage(specs.Spec87ASCII)\nmessage.Unpack(buf)\n```\n\nHere is an example of how to write network header into network connection:\n\n```go\nheader := network.NewBCD2BytesHeader()\npacked, err := message.Pack()\nif err != nil {\n\t// handle error\n}\nheader.SetLength(len(packed))\n_, err = header.WriteTo(conn)\nif err != nil {\n\t// handle error\n}\nn, err := conn.Write(packed)\nif err != nil {\n\t// handle error\n}\n```\n\n## CLI\n\nCLI suports following command:\n\n* `display` to display ISO8583 message in a human-readable format\n\n### Installation\n\n`iso8583` CLI is available as downloadable binaries from the [releases page](https://github.com/moov-io/iso8583/releases/latest) for MacOS, Windows and Linux.\n\nHere is an example how to install MacOS version:\n\n```\nwget -O ./iso8583 https://github.com/moov-io/iso8583/releases/download/v0.4.6/iso8583_0.4.6_darwin_amd64 \u0026\u0026 chmod +x ./iso8583\n```\n\nNow you can run CLI:\n\n```\n➜ ./iso8583\nWork seamlessly with ISO 8583 from the command line.\n\nUsage:\n  iso8583 \u003ccommand\u003e [flags]\n\nAvailable commands:\n  describe: display ISO 8583 file in a human-readable format\n```\n\n\n### Display\n\nTo display ISO8583 message in a human-readable format\n\nExample:\n\n```\n➜ ./bin/iso8583 describe msg.bin\nMTI........................................: 0100\nBitmap.....................................: 000000000000000000000000000000000000000000000000\nBitmap bits................................: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000\nF000 Message Type Indicator................: 0100\nF002 Primary Account Number................: 4242****4242\nF003 Processing Code.......................: 123456\nF004 Transaction Amount....................: 100\nF020 PAN Extended Country Code.............: 4242****4242\nF035 Track 2 Data..........................: 4000****0506=2512111123400001230\nF036 Track 3 Data..........................: 011234****3445=724724000000000****00300XXXX020200099010=********************==1=100000000000000000**\nF045 Track 1 Data..........................: B4815****1896^YATES/EUGENE L^^^356858      00998000000\nF052 PIN Data..............................: 12****78\nF055 ICC Data – EMV Having Multiple Tags...: ICC  ... Tags\n```\n\nYou can specify which of the built-in specs to use to the describe message via\nthe `spec` flag:\n\n```\n➜ ./bin/iso8583 describe -spec spec87ascii msg.bin\n```\n\nYou can also define your spec in JSON format and describe message using the spec file with `spec-file` flag:\n\n```\n➜ ./bin/iso8583 describe -spec-file ./examples/specs/spec87ascii.json msg.bin\n```\n\nPlease, check the example of the JSON spec file [spec87ascii.json](./examples/specs/spec87ascii.json).\n\n\n## Learn about ISO 8583\n\n- [Intro to ISO 8583](./docs/intro.md)\n- [Message Type Indicator](./docs/mti.md)\n- [Bitmaps](./docs/bitmap.md)\n- [Data Fields](./docs/data-elements.md)\n- [ISO 8583 Terms and Definitions](https://www.iso.org/obp/ui/#iso:std:iso:8583:-1:ed-1:v1:en)\n\n## Getting help\n\n channel | info\n ------- | -------\n[Project Documentation](https://github.com/moov-io/iso8583/tree/master/docs) | Our project documentation available online.\nTwitter [@moov](https://twitter.com/moov)\t| You can follow Moov.io's Twitter feed to get updates on our project(s). You can also tweet us questions or just share blogs or stories.\n[GitHub Issue](https://github.com/moov-io/iso8583/issues/new) | If you are able to reproduce a problem please open a GitHub Issue under the specific project that caused the error.\n[moov-io slack](https://slack.moov.io/) | Join our slack channel (`#iso8583`) to have an interactive discussion about the development of the project.\n\n## Contributing\n\n**While [Spec87ASCII](./specs/spec87ascii.go) is appropriate for most users, we hope to see improvements and variations of this specification for different systems by the community. Please do not hesitate to contribute issues, questions, or PRs to cover new use cases. Tests are also appreciated if possible!**\n\nPlease review our [Contributing guide](CONTRIBUTING.md) and [Code of Conduct](CODE_OF_CONDUCT.md) to get started! Check out our [issues for first time contributors](https://github.com/moov-io/iso8583/contribute) for something to help out with.\n\nThis project uses [Go Modules](https://go.dev/blog/using-go-modules) and Go v1.18 or newer. See [Golang's install instructions](https://golang.org/doc/install) for help setting up Go. You can download the source code and we offer [tagged and released versions](https://github.com/moov-io/iso8583/releases/latest) as well. We highly recommend you use a tagged release for production.\n\n## Related projects\nAs part of Moov's initiative to offer open source fintech infrastructure, we have a large collection of active projects you may find useful:\n\n- [Moov ACH](https://github.com/moov-io/ach) provides ACH file generation and parsing, supporting all Standard Entry Codes for the primary method of money movement throughout the United States.\n\n- [Moov Watchman](https://github.com/moov-io/watchman) offers search functions over numerous trade sanction lists from the United States and European Union.\n\n- [Moov Fed](https://github.com/moov-io/fed) implements utility services for searching the United States Federal Reserve System such as ABA routing numbers, financial institution name lookup, and FedACH and Fedwire routing information.\n\n- [Moov Wire](https://github.com/moov-io/wire) implements an interface to write files for the Fedwire Funds Service, a real-time gross settlement funds transfer system operated by the United States Federal Reserve Banks.\n\n- [Moov ImageCashLetter](https://github.com/moov-io/imagecashletter) implements Image Cash Letter (ICL) files used for Check21, X.9 or check truncation files for exchange and remote deposit in the U.S.\n\n- [Moov Metro2](https://github.com/moov-io/metro2) provides a way to easily read, create, and validate Metro 2 format, which is used for consumer credit history reporting by the United States credit bureaus.\n\n\n## License\n\nApache License 2.0 - See [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthought-machine%2Fiso8583","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthought-machine%2Fiso8583","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthought-machine%2Fiso8583/lists"}