背景:在做简单加密并往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();
}