很久没来csdn了。现在的工作地点在银行,妈的,不让上网啊。

写写博客其实是对自己知识的总结,这么长时间了,也该写点东西了。接触银行的项目,避免不了

遇上8583报文。具体介绍就不细讲了,这个网上一大堆介绍的。关键是怎么去组装和解析8583报文?

这个代码还真不好找。在此,我把自己的研究写成一个工具类,看的懂其实很好改写,看不懂就直接拿去用吧。

package com.lsy.common.util;

import java.io.FileInputStream;

import java.io.UnsupportedEncodingException;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Properties;

import java.util.TreeMap;

/**

*

* 这是本人写的ISO8583报文工具类,包含了报文的组装和解析。

*

* 简单介绍下ISO8583。

* 这个东西说白了就是一种数据结构。我们定义一种规则把一堆东西放进去,再按照规则

* 把数据正确拿出来。这就是报文的实质。

*

* ISO8583报文的结构是:前面有16字节(128位)位图数据,后面就是数据。

* 报文最多有128个域(字段)。具体的一个报文不会有这么多,一般是几个域。

* 有哪几个就记录在位图中。而且域有定长和变长之分。

* 这些都是事先定义好的,具体可以看我写的properties定义文件.

*

* 位图转化成01字符串就是128个,如果某一位是1,代表这个域有值,然后按照properties定义的规则取值。

* 如果是0,则这个域没有值。

*

* 再说定长和变长。

* 定长域(定长比较好理解,一个字段规定是N位,那么字段值绝对不能超过N位,不足N位就在后面补空格)

* 变长域(变长域最后组装成的效果:例如变长3位,定义var3,这里的3是指长度值占3位,字段值是123456,最后结果就是006123456)

* 注意(变长的长度按照域值得字节长度计算,而不是按照域值字符串长度算!)

*

* 从网上不难找到ISO8583报文的介绍,这里就不多说了。

* 但是具体解析和组装的代码还真不好找,所以本人就写了一个让刚接触ISO8583报文的人更好入门。

*

*

*

* 解析的容器,我使用了Map,具体到工作中,还是要换成其他的容器的。

* 报文定义说明:config_8583.properties

* 例如

* FIELD031 = string,10

* FIELD032 = string,VAR2

*

* FIELD031是定长,长度是10

* FIELD032是变长,长度值占2位,也就是说长度值最大99,也就是域值最大长度99.

*

* @author lushuaiyin

*

*/

public class Lsy8583Util {

public static String packet_encoding="UTF-8";//报文编码 UTF-8 GBK

private static Map map8583Definition = null;// 8583报文128域定义器

static{

String basepath=Lsy8583Util.class.getClassLoader().getResource("").getPath();

System.out.println(basepath);

System.out.println("Lsy8583Util使用编码配置:[encoding:"+packet_encoding+"]");

Properties property = new Properties();

String path = basepath+"/config_8583.properties";

FileInputStream fis;

try {

fis = new FileInputStream(path);

property.load(fis);

Lsy8583Util.map8583Definition = new HashMap(property);

fis.close();

} catch (Exception e) {

e.printStackTrace();

}

}

// 8583报文初始位图:128位01字符串

public static String getInitBitMap(){

String initBitMap =

"10000000" + "00000000" + "00000000" + "00000000"

+ "00000000" + "00000000" + "00000000" + "00000000"

+ "00000000" + "00000000" + "00000000" + "00000000"

+ "00000000" + "00000000" + "00000000" + "00000000";

return initBitMap;

}

/**

* @param args

*/

public static void main(String[] args) {

try {

//***********************组装8583报文测试--start***********************//

TreeMap filedMap=new TreeMap();//报文域

filedMap.put("FIELD003", "1799");//交易码

filedMap.put("FIELD013", "2013-11-06");//交易日期

filedMap.put("FIELD008", "12345678901");//账号

filedMap.put("FIELD033", "aa索隆bb");//注意这个域是变长域!

filedMap.put("FIELD036", "123456");//注意这个域是变长域!

byte[] send=make8583(filedMap);

System.out.println("完成组装8583报文=="+new String(send,packet_encoding)+"==");

//***********************组装8583报文测试--end***********************//

//***********************解析8583报文测试--start***********************//

Map back=analyze8583(send);

System.out.println("完成解析8583报文=="+back.toString()+"==");

//***********************解析8583报文测试--end***********************//

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

/**

* 组装8583报文

* @param hm

* @return

*/

public static byte[] make8583(TreeMap filedMap){

byte[] whoe8583=null;

if(filedMap==null){

return null;

}

try {

String bitMap128=getInitBitMap();//获取初始化的128位图

//按照8583定义器格式化各个域的内容

Map all=formatValueTo8583(filedMap,bitMap128);

// 获取上送报文内容

whoe8583=getWhole8583Packet(all);

return whoe8583;

} catch (Exception e) {

e.printStackTrace();

}

return whoe8583;

}

/**

* 获取完整的8583报文体(128域)

* @param pacBody

* @return

*/

public static byte[] getWhole8583Packet(Map all){

if(all==null||all.get("formatedFiledMap")==null||all.get("bitMap128")==null){

return null;

}

try {

String bitMap128=(String)all.get("bitMap128");

// 128域位图二进制字符串转16位16进制

byte[] bitmaps= get16BitByteFromStr(bitMap128);

TreeMap pacBody=(TreeMap)all.get("formatedFiledMap");

StringBuffer last128=new StringBuffer();

Iterator it=pacBody.keySet().iterator();

for(;it.hasNext();){

String key=(String)it.next();

String value=(String)pacBody.get(key);

last128.append(value);

}

byte[] bitContent = last128.toString().getBytes(packet_encoding);//域值

//组装

byte[] package8583=null;

package8583=Lsy8583Util.arrayApend(package8583, bitmaps);

package8583=Lsy8583Util.arrayApend(package8583, bitContent);

return package8583;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

public static Map formatValueTo8583(TreeMap filedMap,String bitMap128){

Map all=new HashMap();

TreeMap formatedFiledMap=new TreeMap();//格式化结果

if(filedMap!=null){

Iterator it=filedMap.keySet().iterator();

for(;it.hasNext();){

String fieldName=(String)it.next();//例如FIELD005

String fieldValue=(String)filedMap.get(fieldName);//字段值

try{

if (fieldValue == null) {

System.out.println("error:报文域 {" + fieldName + "}为空值");

fieldValue = "";

return null;

}

//将域值编码转换,保证报文编码统一

fieldValue=new String(fieldValue.getBytes(packet_encoding),packet_encoding);

// 数据域名称FIELD开头的为128域

if (fieldName.startsWith("FIELD") && fieldValue.length() >= 0) {

String fieldNo = fieldName.substring(5, 8);//例如005

// 组二进制位图串

bitMap128 = change16bitMapFlag(fieldNo, bitMap128);

// 获取域定义信息

String[] fieldDef = Lsy8583Util.map8583Definition.get("FIELD" + fieldNo).toString().split(",");

String defType=fieldDef[0];//类型定义例string

String defLen=fieldDef[1];//长度定义,例20

boolean isFixLen=true;//是否定长判断

if(defLen.startsWith("VAR")){//变长域

isFixLen=false;

defLen=defLen.substring(3);//获取VAR2后面的2

}

int fieldLen = fieldValue.getBytes(packet_encoding).length;//字段值得实际长度

// 判断是否为变长域

if (!isFixLen) {// 变长域(变长域最后组装成的效果:例如变长3位,定义var3,这里的3是指长度值占3位,字段值是123456,最后结果就是006123456)

int defLen1 = Integer.valueOf(defLen);

if (String.valueOf(fieldLen).length() > (10*defLen1)) {

System.out.println("error:字段" + fieldName + "的数据定义长度的长度为" + defLen + "位,长度不能超过"+(10*defLen1));

return null;

}else{

//将长度值组装入字段

fieldValue = getVaryLengthValue(fieldValue, defLen1) + fieldValue;

}

} else {//定长域(定长比较好理解,一个字段规定是N位,那么字段值绝对不能超过N位,不足N位就在后面补空格)

int defLen2 = Integer.valueOf(defLen);

if (fieldLen > defLen2) {

System.out.println("error:字段" + fieldName + "的数据定义长度为" + defLen + "位,长度不能超过"+defLen);

return null;

}else{

fieldValue=getFixFieldValue(fieldValue,defLen2);//定长处理

}

}

System.out.println("组装后报文域 {" + fieldName + "}==" + fieldValue+"==,域长度:"+fieldValue.getBytes(packet_encoding).length);

}

// 返回结果赋值

if (filedMap.containsKey(fieldName)) {

if (formatedFiledMap.containsKey(fieldName)) {

formatedFiledMap.remove(fieldName);

}

formatedFiledMap.put(fieldName, fieldValue);

} else {

System.out.println("error:" +fieldName + "配置文件中不存在!");

}

} catch (Exception e) {

e.printStackTrace();

}

}//end for

}

System.out.println("");

all.put("formatedFiledMap", formatedFiledMap);

all.put("bitMap128", bitMap128);

return all;

}

/**

* 解析8583报文

*

* @param content8583

*/

public static Map analyze8583(byte[] content8583) {

TreeMap filedMap=new TreeMap();

try {

// 取位图

byte[] bitMap16byte = new byte[16];

System.arraycopy(content8583, 0, bitMap16byte, 0, 16);

// 16位图转2进制位图128位字符串

String bitMap128Str = get16BitMapStr(bitMap16byte);

//记录当前位置,从位图后开始遍历取值

int pos = 16;

// 遍历128位图,取值。注意从FIELD002开始

for (int i = 1; i < bitMap128Str.length(); i++) {

String filedValue = "";//字段值

String filedName = "FIELD" + getNumThree((i+1));//FIELD005

if (bitMap128Str.charAt(i) == '1') {

// 获取域定义信息

String[] fieldDef = Lsy8583Util.map8583Definition.get(filedName).toString().split(",");

String defType=fieldDef[0];//类型定义例string

String defLen=fieldDef[1];//长度定义,例20

boolean isFixLen=true;//是否定长判断

if(defLen.startsWith("VAR")){//变长域

isFixLen=false;

defLen=defLen.substring(3);//获取VAR2后面的2

}

// 截取该域信息

if (!isFixLen) {//变长域

int defLen1 = Integer.valueOf(defLen);//VAR2后面的2

String realLen1=new String(content8583, pos, defLen1, packet_encoding);//报文中实际记录域长,例如16,023

int realAllLen=defLen1+Integer.valueOf(realLen1);//该字段总长度(包括长度值占的长度)

//filedValue = new String(content8583, pos+defLen1, Integer.valueOf(realLen1), packet_encoding);

byte[] filedValueByte=new byte[Integer.valueOf(realLen1)];

System.arraycopy(content8583, pos+defLen1, filedValueByte, 0, filedValueByte.length);

filedValue=new String(filedValueByte,packet_encoding);

pos += realAllLen;//记录当前位置

} else {//定长域

int defLen2 = Integer.valueOf(defLen);//长度值占的位数

filedValue = new String(content8583, pos, defLen2, packet_encoding);

pos += defLen2;//记录当前位置

}

filedMap.put(filedName, filedValue);

}

}//end for

} catch (Exception e) {

e.printStackTrace();

}

return filedMap;

}

//********************************以下是工具方法,有些没有使用到***********************************************************//

/**

* 复制字符

* @param str

* @param count

* @return

*/

public static String strCopy(String str,int count){

StringBuffer sb = new StringBuffer();

for(int i=0;i < count;i++){

sb.append(str);

}

return sb.toString();

}

/**

* 将setContent放入set(考虑到数组越界)

* @param set

* @param setContent

* @return

*/

public static byte[] setToByte(byte[] set,byte[] setContent){

byte[] res=new byte[set.length];

if(set==null||setContent==null){

}else{

if(set.length

}else{

System.arraycopy(setContent, 0, res, 0, setContent.length);

}

}

return res;

}

public static byte[] setToByte(byte[] set,String setContentStr){

byte[] res=new byte[set.length];

byte[] setContent;

try {

setContent = setContentStr.getBytes(packet_encoding);

res=setToByte(res,setContent);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return res;

}

public static String getPacketLen(int len){

String res="";

String lenStr=String.valueOf(len);

int lenC=4-lenStr.length();

res=strCopy("0",lenC)+lenStr;

return res;

}

public static String getPacketLen(String lenStr){

String res="";

if(lenStr==null){

}else{

res=getPacketLen(Integer.valueOf(lenStr));

}

return res;

}

/**

* 返回a和b的组合,实现累加功能

* @param a

* @param b

* @return

*/

public static byte[] arrayApend(byte[] a,byte[] b){

int a_len=(a==null?0:a.length);

int b_len=(b==null?0:b.length);

byte[] c=new byte[a_len+b_len];

if(a_len==0&&b_len==0){

return null;

}else if(a_len==0){

System.arraycopy(b, 0, c, 0, b.length);

}else if(b_len==0){

System.arraycopy(a, 0, c, 0, a.length);

}else{

System.arraycopy(a, 0, c, 0, a.length);

System.arraycopy(b, 0, c, a.length, b.length);

}

return c;

}

/**

* 改变128位图中的标志为1

* @param fieldNo

* @param res

* @return

*/

public static String change16bitMapFlag(String fieldNo, String res) {

int indexNo=Integer.parseInt(fieldNo);

res = res.substring(0, indexNo-1) + "1" + res.substring(indexNo);

return res;

}

/**

* 位图操作

*

* 把16位图的字节数组转化成128位01字符串

* @param packet_header_map

* @return

*/

public static String get16BitMapStr(byte[] bitMap16){

String bitMap128 = "";

// 16位图转2进制位图128位字符串

for (int i = 0; i < bitMap16.length; i++) {

int bc = bitMap16[i];

bc=(bc<0)?(bc+256):bc;

String bitnaryStr=Integer.toBinaryString(bc);//二进制字符串

// 左补零,保证是8位

String rightBitnaryStr = strCopy("0",Math.abs(8-bitnaryStr.length())) + bitnaryStr;//位图二进制字符串

// 先去除多余的零,然后组装128域二进制字符串

bitMap128+=rightBitnaryStr;

}

return bitMap128;

}

/**

* 位图操作

*

* 把128位01字符串转化成16位图的字节数组

* @param packet_header_map

* @return

*/

public static byte[] get16BitByteFromStr(String str_128){

byte[] bit16=new byte[16];

try {

if(str_128==null||str_128.length()!=128){

return null;

}

// 128域位图二进制字符串转16位16进制

byte[] tmp=str_128.getBytes(packet_encoding);

int weight;//权重

byte[] strout = new byte[128];

int i, j, w = 0;

for (i = 0; i < 16; i++) {

weight = 0x0080;

for (j = 0; j < 8; j++) {

strout[i] += ((tmp[w]) - '0') * weight;

weight /= 2;

w++;

}

bit16[i] = strout[i];

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return bit16;

}

/**

* 从完整的8583报文中获取位图(16字节数组)

* @param packet

* @return

*/

public static byte[] getPacketHeaderMap(byte[] packet){

byte[] packet_header_map = new byte[16];

if(packet==null||packet.length<16){

return null;

}

for(int i=0;i<16;i++){

packet_header_map[i]=packet[i];

}

return packet_header_map;

}

/**

* 从完整的8583报文中获取16位图,转化成128位的01字符串

*

* @param content8583

* @return

*/

public static String get16BitMapFrom8583Byte(byte[] content8583){

// 取位图

byte[] bitMap16 = getPacketHeaderMap(content8583);

// 16位图转2进制位图128位字符串

String bitMap128 = get16BitMapStr(bitMap16);

return bitMap128;

}

//返回字段号码,例如005

public static String getNumThree(int i){

String len="";

String iStr=String.valueOf(i);

len=strCopy("0",3-iStr.length())+iStr;

return len;

}

/**

* 获取字符串变长值

* @param valueStr

* @param defLen

* 例如getFixLengthValue("12345678", 2)返回08

* 例如getFixLengthValue("12345678", 3)返回008

*

* 注意变长长度的计算:

* 长度的判断使用转化后的字节数组长度,因为中文在不同的编码方式下,长度是不同的,GBK是2,UTF-8是3,按字符创长度算就是1.

* 解析报文是按照字节来解析的,所以长度以字节长度为准,防止中文带来乱码。

*

* 比如一个变长域:aa索隆bb,如果按照字符串计算长度那么就是6,最后是06aa索隆bb。

* 这样在解析时按照字节解析长度就乱了,因为按照GBK字节解析,一个汉字占2,按照UTF-8解析,一个汉字占3.

* 所以在计算时必须按照字节长度为准!按照我们设置的UTF-8编码结果就是10aa索隆bb.

* 这样在解析时长度正好是10,也就不会乱了。

* @return

*/

public static String getVaryLengthValue(String valueStr,int defLen){

return getVaryLengthValue(valueStr,defLen,packet_encoding);

}

public static String getVaryLengthValue(String valueStr,int defLen,String encoding){

String fixLen="";

try{

if(valueStr==null){

return strCopy("0",defLen);

}else{

byte[] valueStrByte=null;

//这里最好指定编码,不使用平台默认编码

if(encoding==null||encoding.trim().equals("")){

valueStrByte=valueStr.getBytes();

}else{

valueStrByte=valueStr.getBytes(encoding);

}

//长度的判断使用转化后的字节数组长度,因为中文在不同的编码方式下,长度是不同的,GBK是2,UTF-8是3,按字符创长度算就是1.

//解析报文是按照字节来解析的,所以长度以字节长度为准,防止中文带来乱码

if(valueStrByte.length>(10*defLen)){

return null;

}else{

int len=valueStrByte.length;//字段实际长度

String len1=String.valueOf(len);

fixLen=strCopy("0",(defLen-len1.length()))+len1;

}

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return fixLen;

}

/**

* 将字段值做定长处理,不足定长则在后面补空格

* @param valueStr

* @param defLen

* @return

*/

public static String getFixFieldValue(String valueStr,int defLen){

return getFixFieldValue(valueStr,defLen,packet_encoding);

}

public static String getFixFieldValue(String valueStr,int defLen,String encoding){

String fixLen="";

try {

if(valueStr==null){

return strCopy(" ",defLen);

}else{

byte[] valueStrByte=null;

//这里最好指定编码,不使用平台默认编码

if(encoding==null||encoding.trim().equals("")){

valueStrByte=valueStr.getBytes();

}else{

valueStrByte=valueStr.getBytes(encoding);

}

//长度的判断使用转化后的字节数组长度,因为中文在不同的编码方式下,长度是不同的,GBK是2,UTF-8是3,按字符创长度算就是1.

//解析报文是按照字节来解析的,所以长度以字节长度为准,防止中文带来乱码

if(valueStrByte.length>defLen){

return null;

}else{

fixLen=valueStr+strCopy(" ",defLen-valueStrByte.length);

}

}

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return fixLen;

}

public static String getPacket_encoding() {

return packet_encoding;

}

public static void setPacket_encoding(String packet_encoding) {

Lsy8583Util.packet_encoding = packet_encoding;

}

public static Map getMap8583Definition() {

return map8583Definition;

}

public static void setMap8583Definition(Map map8583Definition) {

Lsy8583Util.map8583Definition = map8583Definition;

}

}

报文域配置文件:config_8583.properties

FIELD002 = string,16

FIELD003 = string,4

FIELD004 = string,20

FIELD005 = string,20

FIELD006 = string,20

FIELD007 = string,10

FIELD008 = string,32

FIELD009 = string,3

FIELD010 = string,20

FIELD011 = string,6

FIELD012 = string,6

FIELD013 = string,10

FIELD014 = string,10

FIELD015 = string,10

FIELD016 = string,6

FIELD017 = string,6

FIELD018 = string,6

FIELD019 = string,6

FIELD020 = string,7

FIELD021 = string,7

FIELD022 = string,3

FIELD023 = string,3

FIELD024 = string,8

FIELD025 = string,5

FIELD026 = string,8

FIELD027 = string,1

FIELD028 = string,5

FIELD029 = string,5

FIELD030 = string,5

FIELD031 = string,10

FIELD032 = string,VAR2

FIELD033 = string,VAR2

FIELD034 = string,VAR2

FIELD035 = string,VAR2

FIELD036 = string,VAR3

FIELD037 = string,10

FIELD038 = string,4

FIELD039 = string,6

FIELD040 = string,2

FIELD041 = string,3

FIELD042 = string,16

FIELD043 = string,20

FIELD044 = string,VAR2

FIELD045 = string,VAR2

FIELD046 = string,VAR3

FIELD047 = string,VAR3

FIELD048 = string,VAR3

FIELD049 = string,3

FIELD050 = string,VAR3

FIELD051 = string,VAR3

FIELD052 = string,16

FIELD053 = string,VAR2

FIELD054 = string,VAR3

FIELD055 = string,VAR3

FIELD056 = string,VAR3

FIELD057 = string,VAR3

FIELD058 = string,VAR3

FIELD059 = string,VAR3

FIELD060 = string,VAR3

FIELD061 = string,VAR3

FIELD062 = string,VAR3

FIELD063 = string,VAR3

FIELD064 = string,16

FIELD065 = string,2

FIELD066 = string,1

FIELD067 = string,2

FIELD068 = string,16

FIELD069 = string,16

FIELD070 = string,3

FIELD071 = string,4

FIELD072 = string,2

FIELD073 = string,10

FIELD074 = string,10

FIELD075 = string,22

FIELD076 = string,17

FIELD077 = string,32

FIELD078 = string,VAR3

FIELD079 = string,6

FIELD080 = string,32

FIELD081 = string,32

FIELD082 = string,4

FIELD083 = string,4

FIELD084 = string,6

FIELD085 = string,15

FIELD086 = string,20

FIELD087 = string,20

FIELD088 = string,20

FIELD089 = string,6

FIELD090 = string,9

FIELD091 = string,9

FIELD092 = string,9

FIELD093 = string,VAR3

FIELD094 = string,2

FIELD095 = string,42

FIELD096 = string,8

FIELD097 = string,42

FIELD098 = string,3

FIELD099 = string,3

FIELD100 = string,80

FIELD101 = string,VAR3

FIELD102 = string,80

FIELD103 = string,80

FIELD104 = string,VAR3

FIELD105 = string,VAR3

FIELD106 = string,VAR3

FIELD107 = string,VAR3

FIELD108 = string,2

FIELD109 = string,VAR3

FIELD110 = string,9

FIELD111 = string,VAR3

FIELD112 = string,VAR3

FIELD113 = string,VAR3

FIELD114 = string,VAR3

FIELD115 = string,3

FIELD116 = string,VAR3

FIELD117 = string,VAR3

FIELD118 = string,VAR3

FIELD119 = string,VAR3

FIELD120 = string,VAR3

FIELD121 = string,32

FIELD122 = string,VAR3

FIELD123 = string,VAR3

FIELD124 = string,VAR3

FIELD125 = string,VAR3

FIELD126 = string,VAR3

FIELD127 = string,VAR3

FIELD128 = string,8

简单说下,

FIELD031 = string,10

FIELD032 = string,VAR2

string代表域值类型(我只用到了string,别的就没定义了),10表示该域是定长10位。

如果是变长就定义成var,后面的2表示变长长度占2位,那么域最大就是99位。

运行打印结果:

/D:/AppleZero/workSpace/apple/target/classes/

Lsy8583Util使用编码配置:[encoding:UTF-8]

组装后报文域 {FIELD003}==1799==,域长度:4

组装后报文域 {FIELD008}==12345678901 ==,域长度:32

组装后报文域 {FIELD013}==2013-11-06==,域长度:10

组装后报文域 {FIELD033}==10aa索隆bb==,域长度:12

组装后报文域 {FIELD036}==006123456==,域长度:9

完成组装8583报文==?

打印的有些字节复制出来就看不到了,我把控制台打印截图吧。

java 8583报文解析_ISO8583报文工具类(组装和解析报文) | 学步园相关推荐

  1. java序列化和反序列化工具_Java 序列化和反序列化工具类并解决StreamCorruptedException问题 | 学步园...

    问题: 若通过ObjectOutputStream向一个文件中多次以追加的方式写入Object,为什么用ObjectInputStream读取这些Object时,会产生StreamCorruptedE ...

  2. java jexl 工具类_jexl表达式解析、计算工具类.md

    jexl表达式解析.计算工具类.md 根据表达式可以动态反向解析出变量:适合动态表达式,参数未知场景 如 (A0.2+B0.8)/C 解析出 A\B\C,把ABC参数值代入计算 初始化引擎 priva ...

  3. java工具类源码阅读,java学习日记第二天(实用的工具类和源码解析一Arrays)

    本帖最后由 三木猿 于 2020-9-18 11:17 编辑 每日名言 学者须先立志.今日所以悠悠者,只是把学问不曾做一件事看,遇事则且胡乱恁地打过了,此只是志不立. --朱熹 工作中经常会用到一些工 ...

  4. Java学习总结:58(Collections工具类)

    Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...

  5. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  6. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  7. Java 图片添加数字暗水印工具类

    Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...

  8. Java时间戳与日期格式转换工具类

    Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...

  9. java获取客户端的IP地址工具类

    java获取客户端的IP地址工具类 import java.net.InetAddress; import java.net.UnknownHostException;import javax.ser ...

  10. Java判断不为空的工具类总结

    Java判断不为空的工具类总结 1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. 1 package com.bie.util; 2 3 import jav ...

最新文章

  1. 为Visual Studio添加配色方案
  2. 360起诉山东卫视或有利于杜绝有偿新闻
  3. javascript高级程序设计之引用类型
  4. 基于I2C总线的0.96寸OLED显示屏驱动
  5. xml与java代码相互装换的工具类
  6. Linux 命令(123)—— iostat 命令
  7. java初学者书籍_面向初学者的5本最佳Java核心书籍
  8. shell学习笔记二
  9. 中国全国行政代码、邮政编码、区号、名称、简称、经纬度 数据库
  10. 【网络】交换机常用命令
  11. 怎么判断苹果开发者账号是否认证了
  12. 英语: 听力(Listening)
  13. linux tao环境 安装_菜鸟Linux 编译TAO2.0a的问题,求高手指导
  14. 安卓开发常用词汇总结
  15. python兔子生兔子
  16. HBO Max for Mac(HBO Max客户端)
  17. Tcp/ip协议 详解
  18. php yii2.0框架下载,yii2.0下载|yii2.0(php框架) v2.0.10官方版 附安装教程 - 121下载站...
  19. Excel数据如何导入到Oracle数据库中
  20. user_agreement

热门文章

  1. css图片自适应浏览器宽度
  2. java 手势识别_手势识别简单小程序(java)
  3. 学生管理系统 前后端分离项目【简约版】
  4. Windows消息大全(易语言版)
  5. 转【Qualcomm高通音频】调试工具QACT_如何新增一套音效
  6. 淘宝商品数据分析怎么操作?从哪些方面下手?
  7. android寻找手机,详细攻略:如何找回丢失或被盗的安卓手机
  8. 一文读懂交叉熵损失函数
  9. 创建角色和ansible-galaxy简单使用
  10. javascript day 02