簡單聊聊8583

2021-07-26 23:40:29 字數 3536 閱讀 9659

網上應該有不少關於8583的文章,這個算是屬於老生常談了,但是要找一篇細緻的,容易理解的可能還真不太好找,那我們今天就來簡單的聊聊。

這個其實銀聯給的文件上已經很全了,我們再複習下

—— m 強制域(mandatory),此域在該訊息中必須出現否則將被認為訊息格式出錯。

—— c 條件域(conditional),此域在一定條件下出現在該訊息中,具體的條件請參考備註中的說明。

—— o 選用域(optional),此域在該訊息中由傳送方自選。

—— space 此域在該種訊息中不出現。

—— a 字母a-z

—— n 數字0-9

—— s 特殊字元

—— an 字母和數字字元

—— ans 字母、數字和特殊字元

—— mm 月

—— dd 日

—— yy 年

—— hh 小時

—— mm 分

—— ss 秒

—— ll 允許的最大長度為99

—— lll 允許的最大長度為999

—— var 可變長度域

—— b 資料的二進位制表示,後跟數字表示位(bit)的個數

—— b 用於表示變長的二進位制數,後跟數字表示二進位制資料所佔位元組(byte)的個數

—— z 按gb/t 15120和gb/t 17552的2、3磁軌編碼

—— cn bcd壓縮編碼數值

其它的都不說了,我們就聊聊 llvar、lllvar bcd這三個資料格式吧

ok,這些基本的概念統一後,我們就可以上乾貨了(網上大部分都是c的,咱們今天來個c#的,方便在pc上除錯),看下面**,首先是剛剛咱們說的資料格式,還有8583每條記錄的資料結構

public

enum iso8583datatype

public

struct iso8583

;

這樣的注釋應該不需要再囉嗦什麼了吧。

然後就是,初始化,打包,解包了,請看**

初始化

private void master_init(int ipos, string data_name, short length, iso8583datatype attribute, short variable_flag, byte data)

打包的主要部分

switch (master[i].attribute)

else

tmpbuf = asctobcd(tmpstr, tmpstr.length / 2); // bcd 碼

tmpbuf.copyto(buf, offset);

offset += (tmpstr.length / 2);

break;

case iso8583datatype.an:

case iso8583datatype.ans:

if (master[i].variable_flag > 0) // 該域(字段)是變長

else

break;

default:

if (master[i].variable_flag > 0) // 該域(字段)是變長

tmpbuf = master[i].data;

tmpbuf.copyto(buf, offset);

offset += master[i].length;

break;

}

解包

switch (master[i].attribute)

else

// offset += master[i].variable_flag;

string

strlen = (bitconverter.tostring(st_len)).replace("-",

"");

switch (master[i].variable_flag)

if ((ilen % 2) == 1)

itemplen = ilen + 1

;else

itemplen = ilen;

btempdata = new byte[itemplen / 2];

array.copy(buf, offset, btempdata,

0, itemplen / 2);

stempdata = (bitconverter.tostring(btempdata)).replace("-",

"");

stempdata = stempdata.substring(0, ilen);

"len", ilen.tostring());

master[i].data = new byte[ilen];

master[i].data = encoding.ascii.getbytes(stempdata);

offset += (itemplen / 2);

}else

break;

case iso8583datatype.an:

case iso8583datatype.ans:

if (master[i].variable_flag > 0) // 該域變長

else

// offset += master[i].variable_flag;

string

strlen = (bitconverter.tostring(st_len)).replace("-",

"");

switch (master[i].variable_flag)

master[i].data = new byte[ilen];

array.copy(buf, offset, master[i].data, 0, ilen);

offset += ilen;// master[i].length;

}else

break;

default:

if (master[i].variable_flag > 0) // 該域變長

master[i].data = new byte[ilen];

array.copy(buf, offset, master[i].data, 0, ilen);

offset += ilen;

}else

break;

}

ok,估計大家也不樂意看這些內容,簡單說一下就是我們根據bit map 來確定那乙個域是否有值,若是有值,再看他是什麼格式,不同的格式(a,n,llvar等),有不同的對齊方法(左對齊,右對齊),然後來根據這些規則來進行打包,解包。

其實8583不複雜,只要記得初始化,打包,解包,獲取某乙個域的值,然後進行業務判定,就可以完成相當一部分的工作了。其它比如有些變種,我們可以根據不同的資料型別,在列印或者是解包的時候,改變一下相應的需求。128域的8583報文同樣是這個規則,只要掌握了規則,其它的都是在這個基礎上進行演變。目前只想到了這麼多,其它的想到了,再補上吧

簡單聊聊HUGEPAGE

可能很多朋友都了解在大記憶體的伺服器上使用hugepage有助於提公升應用的效能?不過為什麼會這樣呢?是不是使用hugepage就一定對應用的效能有幫助呢?linux的transparent hugepages功能是不是對我們有幫助呢?如果要回答這些問題,我們必須了解hugepage是什麼,可能很多...

簡單聊聊echarts

2.準備乙個具備大小的dom容器 3.初始化echarts實列物件 4.指定配置項和資料 5.將配置項設定給echarts實列物件 echarts的屬性 title設定圖示的標題 tooltip是滑鼠放上去顯示的內容 圖表的提示框 tooptip legend是圖例元件 如果series物件 有na...

簡單聊聊HTTP TCP IP協議

一丶什麼是http協議 http協議是hypertexttransferprotocol 超文字傳輸協議 的簡寫,它是tcp ip協議的乙個應用層協議,用於定義web瀏覽器伺服器之間交換資料的過程,客戶端連上web伺服器後,若想獲得web伺服器中的某個資源,需遵守一定的通訊格式,http協議用於定義...