背景:在做简单加密并往oracle数据库插值时发现char值超过128会导致库里乱码;大佬领导研究以后发现大概是如下问题:
解决的关键点:
转字节流;
结合oracle函数UTL_RAW.CAST_TO_RAW()、UTL_RAW.CAST_TO_VARCHAR2()。
/*** 转字节* * @param c* @return*/private byte[] to_bytes(char c) {int i = (int) c;if (i > 0xFF) {CharBuffer cb = CharBuffer.wrap(new char[] { c });ByteBuffer bb = charset.encode(cb);return bb.array();} else {return new byte[] { (byte) i };}}/*** 加密* * @param password* @return*/private byte[] encode(String password) {ByteArrayOutputStream out = new ByteArrayOutputStream();int j = 1;for (char c_p : password.toCharArray()) {byte[] bytes = to_bytes(c_p);for (byte b : bytes) {int c = b & 0xFF;int cc = (j % 2 == 0) ? (c + j - 32) : (c - j + 8);out.write(cc);j++;}}return out.toByteArray();}