packagecom.dcqq.common.utils.wx;importjava.security.MessageDigest;publicclassMD5{privatestaticStringbyteArrayToHexString(byte b[]){StringBuffer resultSb =newStringBuffer();for(int i =0; i < b.length; i++)resultSb.append(byteToHexString(b[i]));return resultSb.toString();}privatestaticStringbyteToHexString(byte b){int n = b;if(n <0)n +=256;int d1 = n /16;int d2 = n %16;return hexDigits[d1]+ hexDigits[d2];}publicstaticStringMD5Encode(String origin,String charsetname){String resultString =null;try{resultString =newString(origin);MessageDigest md =MessageDigest.getInstance("MD5");if(charsetname ==null||"".equals(charsetname))resultString =byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString =byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));}catch(Exception exception){}return resultString;}privatestaticfinalString hexDigits[]={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};}
packagecom.dcqq.common.utils.wx;importjava.text.SimpleDateFormat;importjava.util.*;publicclassPayCommonUtil{/*** 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。* @return boolean*/publicstaticbooleanisTenpaySign(String characterEncoding,SortedMap<Object,Object> packageParams,StringAPI_KEY){StringBuffer sb =newStringBuffer();Set es = packageParams.entrySet();Iterator it = es.iterator();while(it.hasNext()){Map.Entry entry =(Map.Entry)it.next();String k =(String)entry.getKey();String v =(String)entry.getValue();if(!"sign".equals(k)&&null!= v &&!"".equals(v)){sb.append(k +"="+ v +"&");}}sb.append("key="+API_KEY);//算出摘要String mysign =MD5.MD5Encode(sb.toString(), characterEncoding).toLowerCase();String tenpaySign =((String)packageParams.get("sign")).toLowerCase();//System.out.println(tenpaySign + " " + mysign);return tenpaySign.equals(mysign);}/*** @author* @Description:sign签名 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=3* @param characterEncoding* 编码格式* @param parameters* 请求参数* @return*/publicstaticStringcreateSign(String characterEncoding,SortedMap<String,Object> packageParams,StringAPI_KEY){StringBuffer sb =newStringBuffer();Set es = packageParams.entrySet();Iterator it = es.iterator();while(it.hasNext()){Map.Entry entry =(Map.Entry) it.next();String k = entry.getKey().toString();String v = entry.getValue().toString();if(null!= v &&!"".equals(v)&&!"sign".equals(k)&&!"key".equals(k)){sb.append(k +"="+ v +"&");}}sb.append("key="+API_KEY);System.out.println(sb.toString());String sign =MD5.MD5Encode(sb.toString(), characterEncoding).toUpperCase();return sign;}/*** @author* @Description:将请求参数转换为xml格式的string* @param parameters* 请求参数* @return*/publicstaticStringgetRequestXml(SortedMap<String,Object> parameters){StringBuffer sb =newStringBuffer();sb.append("<xml>");Set es = parameters.entrySet();Iterator it = es.iterator();while(it.hasNext()){Map.Entry entry =(Map.Entry) it.next();String k = entry.getKey().toString();String v = entry.getValue().toString();if("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)){sb.append("<"+ k +">"+"<![CDATA["+ v +"]]></"+ k +">");}else{sb.append("<"+ k +">"+ v +"</"+ k +">");}}sb.append("</xml>");return sb.toString();}/*** 取出一个指定长度大小的随机正整数.** @param length* int 设定所取出随机数的长度。length小于11* @return int 返回生成的随机数。*/publicstaticintbuildRandom(int length){int num =1;double random =Math.random();if(random <0.1){random = random +0.1;}for(int i =0; i < length; i++){num = num *10;}return(int)((random * num));}/*** 获取当前时间 yyyyMMddHHmmss** @return String*/publicstaticStringgetCurrTime(){Date now =newDate();SimpleDateFormat outFormat =newSimpleDateFormat("yyyyMMddHHmmss");String s = outFormat.format(now);return s;}}
packagecom.dcqq.common.utils.wx;importorg.jdom.Document;importorg.jdom.Element;importorg.jdom.JDOMException;importorg.jdom.input.SAXBuilder;importjava.io.ByteArrayInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;publicclassXMLUtil{publicstaticMapdoXMLParse(String strxml)throwsJDOMException,IOException{strxml = strxml.replaceFirst("encoding=\".*\"","encoding=\"UTF-8\"");if(null== strxml ||"".equals(strxml)){returnnull;}Map m =newHashMap();InputStream in =newByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder =newSAXBuilder();Document doc = builder.build(in);Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while(it.hasNext()){Element e =(Element) it.next();String k = e.getName();String v ="";List children = e.getChildren();if(children.isEmpty()){v = e.getTextNormalize();}else{v =XMLUtil.getChildrenText(children);}m.put(k, v);}//关闭流in.close();return m;}/*** 获取子结点的xml* @param children* @return String*/publicstaticStringgetChildrenText(List children){StringBuffer sb =newStringBuffer();if(!children.isEmpty()){Iterator it = children.iterator();while(it.hasNext()){Element e =(Element) it.next();String name = e.getName();String value = e.getTextNormalize();List list = e.getChildren();sb.append("<"+ name +">");if(!list.isEmpty()){sb.append(XMLUtil.getChildrenText(list));}sb.append(value);sb.append("</"+ name +">");}}return sb.toString();}}
【LangChain学习之旅】—(6) 提示工程(下):用思维链和思维树提升模型思考质量 什么是 Chain of ThoughtFew-Shot CoTZero-Shot CoTChain of Thought 实战CoT 的模板设计程序的完整框架Tree of Thought总结 Reference&a…
ORB(Oriented FAST and Rotated BRIEF)是一种用于图像特征提取和描述的算法。它是FAST角点检测器和BRIEF特征描述符的结合体,通过在FAST角点周围计算BRIEF描述符来提取关键点的特征。
ORB算法具有以下特点:
1.速度快:…