網上應該有不少關於8583的文章,這個算是屬於老生常談了,但是要找一篇細緻的,容易理解的可能還真不太好找,那我們今天就來簡單的聊聊。
這個其實銀聯給的文件上已經很全了,我們再複習下
—— m 強制域(mandatory),此域在該訊息中必須出現否則將被認為訊息格式出錯。其它的都不說了,我們就聊聊 llvar、lllvar bcd這三個資料格式吧—— 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壓縮編碼數值
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協議用於定義...