Java 将oracle十六进制字符串转换为实际字符串值
我已经从Oracle Logminor中提取了数据,您需要将其转换为有用的sql。以下是数据Java 将oracle十六进制字符串转换为实际字符串值,java,sql,oracle,hex,Java,Sql,Oracle,Hex,我已经从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'),H
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));
}
}
公共类StringToHex{
公共字符串转换器StringToHex(字符串str){
char[]chars=str.toCharArray();
StringBuffer十六进制=新的StringBuffer();
for(int i=0;i 对于(inti=0;i我不确定为什么要提取原始值,但这些是的二进制表示,与Java中的任何数据类型都不对应
您可以通过使用UTL_原始包查看此值的来源:
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\u RAW.CAST\u to\u number
或:
对于第一个字节,第一个1
位表示它是一个正数。这就剩下1000001=65
,我们减去64得到1,所以指数是100^1
对于第二个字节,00101101=45
,减去1得到44。因此最终的数字是0.44 x 100^1
,或44
我不会再讨论小数点或负数了,你可以自己读
我认为你应该使用UTL\u RAW.CAST\u TO\u NUMBER
select utl_raw.cast_to_number(hextoraw('C12D')) from dual; -- 44
我已找到解决方案,请参阅此代码
using System;
public class num2raw
{
public static void Main()
{
Decimal p_number = Decimal.Parse("44");
string v_result = "";
Int16 v_exponent;
Int16 v_bcd;
Decimal v_temp;
if (p_number == 0)
v_result = "80";
else if (p_number > 0) {
v_temp = p_number;
v_exponent = Convert.ToInt16(193 + Math.Floor(Math.Log(Convert.ToDouble(p_number),100)));
while (v_temp != Math.Floor(v_temp))
v_temp *= 100;
while (v_temp % 100 == 0)
v_temp = Math.Floor(v_temp/100);
while (v_temp > 0) {
v_bcd = Convert.ToInt16(v_temp % 100);
v_result = String.Format("{0:X2}", v_bcd+1) + v_result;
v_temp = Math.Floor(v_temp/100);
}
v_result = String.Format("{0:X2}", v_exponent) + v_result;
}
else { // p_number < 0
v_temp = -p_number;
v_exponent = Convert.ToInt16(62 - Math.Floor(Math.Log(Convert.ToDouble(v_temp),100)));
while (v_temp != Math.Ceiling(v_temp))
v_temp *= 100;
while (v_temp % 100 == 0)
v_temp = Math.Floor(v_temp/100);
while (v_temp > 0) {
v_bcd = Convert.ToInt16(v_temp % 100);
v_result = String.Format("{0:X2}", 101 -v_bcd) + v_result;
v_temp = Math.Floor(v_temp/100);
}
v_result = String.Format("{0:X2}", v_exponent) + v_result;
if (v_result.Length < 42)
v_result = v_result + "66";
}
Console.WriteLine(v_result);
}
}
使用系统;
公共类num2raw
{
公共静态void Main()
{
十进制p_数=十进制解析(“44”);
字符串v_result=“”;
int16v_指数;
Int16 v_bcd;
十进制v_温度;
如果(p_数==0)
v_result=“80”;
否则如果(p_编号>0){
v_temp=p_编号;
v_指数=Convert.ToInt16(193+数学层(Math.Log(Convert.ToDouble(p_编号),100));
while(v_temp!=数学地板(v_temp))
v_温度*=100;
而(v_temp%100==0)
v_温度=数学地板(v_温度/100);
而(v_温度>0){
v_bcd=转换为16(v_温度%100);
v_result=String.Format(“{0:X2}”),v_bcd+1)+v_result;
v_温度=数学地板(v_温度/100);
}
v_result=String.Format(“{0:X2}”,v_指数)+v_result;
}
else{//p_数<0
v_temp=-p_编号;
v_指数=Convert.ToInt16(62-数学层(Math.Log)(Convert.ToDouble(v_temp),100));
while(v_temp!=数学上限(v_temp))
v_温度*=100;
而(v_temp%100==0)
v_温度=数学地板(v_温度/100);
而(v_温度>0){
v_bcd=转换为16(v_温度%100);
v_result=String.Format(“{0:X2}”),101-v_bcd)+v_result;
v_温度=数学地板(v_温度/100);
}
v_result=String.Format(“{0:X2}”,v_指数)+v_result;
如果(v_结果长度<42)
v_结果=v_结果+“66”;
}
控制台写入线(v_结果);
}
}
如果我想在sql server中使用相同的数据怎么办?如果存在类似于utl\u raw.cast\u to\u number的数据,我想在sql server中应用这些数据(hextoraw
要转换oracle十六进制,那么就很好了不,我不认为SQL Server有一个内置的函数来将oracle数字从十六进制/二进制转换。使用一个以可用格式保存数据的过程从oracle提取数据。还有什么事吗?我想解析SQL并在SQL Server中应用它,因为它在SQL serv中是有用的语句er级别或类似java或c之类的第三方#
using System;
public class num2raw
{
public static void Main()
{
Decimal p_number = Decimal.Parse("44");
string v_result = "";
Int16 v_exponent;
Int16 v_bcd;
Decimal v_temp;
if (p_number == 0)
v_result = "80";
else if (p_number > 0) {
v_temp = p_number;
v_exponent = Convert.ToInt16(193 + Math.Floor(Math.Log(Convert.ToDouble(p_number),100)));
while (v_temp != Math.Floor(v_temp))
v_temp *= 100;
while (v_temp % 100 == 0)
v_temp = Math.Floor(v_temp/100);
while (v_temp > 0) {
v_bcd = Convert.ToInt16(v_temp % 100);
v_result = String.Format("{0:X2}", v_bcd+1) + v_result;
v_temp = Math.Floor(v_temp/100);
}
v_result = String.Format("{0:X2}", v_exponent) + v_result;
}
else { // p_number < 0
v_temp = -p_number;
v_exponent = Convert.ToInt16(62 - Math.Floor(Math.Log(Convert.ToDouble(v_temp),100)));
while (v_temp != Math.Ceiling(v_temp))
v_temp *= 100;
while (v_temp % 100 == 0)
v_temp = Math.Floor(v_temp/100);
while (v_temp > 0) {
v_bcd = Convert.ToInt16(v_temp % 100);
v_result = String.Format("{0:X2}", 101 -v_bcd) + v_result;
v_temp = Math.Floor(v_temp/100);
}
v_result = String.Format("{0:X2}", v_exponent) + v_result;
if (v_result.Length < 42)
v_result = v_result + "66";
}
Console.WriteLine(v_result);
}
}