java - 将 oracle 十六进制字符串转换为实际字符串值
问题描述
我已从 Oracle Logminor 中提取数据,您需要将其转换为有用的 sql。下面是数据
SQL_REDO from logminer:
insert into "UNKNOWN"."OBJ# 74587"("COL 1","COL 2","COL 3","COL 4","COL 5","COL 6","COL 7","COL 8","COL 9")
values (HEXTORAW('c12d'),HEXTORAW('c4032c362e'),HEXTORAW('c3042222'),HEXTORAW('c105'),HEXTORAW('c3394c44'),HEXTORAW('c108'),HEXTORAW('c108'),HEXTORAW('c109'),HEXTORAW('c10b'));
Required Value:
Insert Into Scott.Test_Table
Select 44,2435345,33333,4.1234,567567,6.766,7,8,10 From Dual;
So I need help with the conversion from the Hex value to the actual value, this is for all data types.
for example:
c12d = 44
c4032c362e = 2435345
etc
下面是我尝试转换的java代码,但它没有将十六进制完全转换为字符串
public class StringToHex{
public String convertStringToHex(String str){
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for(int i = 0; i < chars.length; i++){
hex.append(Integer.toHexString((int)chars[i]));
}
return hex.toString();
}
public String convertHexToString(String hex){
StringBuilder sb = new StringBuilder();
StringBuilder temp = new StringBuilder();
//49204c6f7665204a617661 split into two characters 49, 20, 4c...
for( int i=0; i<hex.length()-1; i+=2 ){
//grab the hex in pairs
String output = hex.substring(i, (i + 2));
//convert hex to decimal
int decimal = Integer.parseInt(output, 16);
//convert the decimal to character
sb.append((char)decimal);
temp.append(decimal);
}
System.out.println("Decimal : " + temp.toString());
return sb.toString();
}
public static void main(String[] args) {
StringToHex strToHex = new StringToHex();
System.out.println("\n***** Convert ASCII to Hex *****");
String str = "2435345";
System.out.println("Original input : " + str);
String hex = strToHex.convertStringToHex(str);
System.out.println("Hex : " + hex);
System.out.println("\n***** Convert Hex to ASCII *****");
System.out.println("Hex : " + hex);
System.out.println("ASCII : " + strToHex.convertHexToString(hex));
}
}
请建议我如何理解 Oracle 十六进制代码以将其转换为实际字符串。根据上面的代码,它不符合我上面提到的字符串
解决方案
我不确定你为什么要提取原始值,但这些是Oracle number datatype的二进制表示,它不对应于 Java 中的任何数据类型。
您可以使用 UTL_RAW 包查看此值的来源:
select rawtohex(utl_raw.cast_from_number(44)) from dual; -- C12D
select rawtohex(utl_raw.cast_from_binary_integer(44)) from dual; -- 2C = 101100 = 44
select rawtohex(utl_raw.cast_to_raw('44')) from dual; -- 3434 = ASCII "4" "4"
如果您想C12D
从 Oracle 数字转换为十进制表示,您可以使用,也可以使用UTL_RAW.CAST_TO_NUMBER
困难的方法:
C12D = 11000001 00101101
对于第一个字节,第1
一位表示它是一个正数。剩下1000001 = 65
,我们减去 64 得到 1,所以指数是 100^1。
对于第二个字节,00101101 = 45
减去 1 得到 44。所以最终数字是0.44 x 100^1
,或 44。
我不会再深入小数位或负数,您可以自己阅读。
我认为你应该只使用UTL_RAW.CAST_TO_NUMBER
.
select utl_raw.cast_to_number(hextoraw('C12D')) from dual; -- 44
推荐阅读
- java - 为什么 List.contains(Object) 的行为不同?
- r - 如何在同一个数据帧上做colsum和average
- powerbi - 使用 DAX 生成日期系列
- javascript - 仅在服务器上需要一个包
- java - Intellij IDEA 仅针对所有未提交的更改运行测试
- regex - 在换行符之前匹配字符,不包括空格?
- macos - MacOS - 使用带有launchd的脚本 - 启动,登录,注销,关闭?
- service-worker - Workbox 的服务人员在更改时未更新
- python - AllenNLP 共指分辨率的多 GPU 训练
- reactjs - 事件处理程序中带有 [name] 的 PrevState