从 ORACLE的RAWTOHEX到C#的RAWTOHEX
2013-06-14 09:54
537 查看
我们先了解一下基本知识:
我们知道Oracle中有函数RAWTOHEX(rawvalue),将RAW类数值转换成一个相应的16进制表示的字符串,rawvalue中的每个字节都被转换成为一个双字节的字符串。当我们给数据表中的ID定义成RAW(16)类型时,用RAWTOHEX(ID)得到的将是一个用16进制表示的字符串,该字符串的长度是32。同理RAW(8)得到的应该是一个长度为16的字符串。
ORACLE中有一个SYS_GUID()函数,返回的是唯一的16进制表示的字符串,长度也是32.因此我们可以给RAW(16)类型的ID设置默认值为:SYS_GUID(),但不能给字节数小于16的RAW类型设置SYS_GUID(),会提示长度超出范围。
接下来就是我遇到的问题了,通常我们在PL/SQL中写查询语句时都这么写:select ID from test,看到的ID显示为已经被RAWTOHEX过的数据,比如:A03BDB52E4800D74E044001321BD1C8B,但我们在C#中查询ORACLE数据库时,会将RAW(16)类型的ID返回为一个 byte[]数组,长度为16.这和我们在PL/SQL中看到的ID是不一样的。有时候在调试代码时想看看这个ID是不是我们想要的ID时很不方便。因此我们有必要吧这个数组转换成和PL/SQL中一样的数据显示。
我们上面已经了解到这个byte[]数组中的每一个byte都被转换成了一个双字节的字符串,我们在C#中也定义一个RAWTOHEX函数,如下:
[c-sharp] view
plaincopy
static string RAWTOHEX(byte[] b)
{
StringBuilder sb = new StringBuilder();
foreach (byte by in b)
{
string s = Convert.ToString(by, 16);//将字节转换成对应的字符
if (s.Length==1)
{
s = "0" + s;//当字符不足两位时,在前面补0,补足两位字符,因为字符串“01”转换成的字节为1,而将字节再转换成字符串的时候就变成了“1”,因此要补0
}
sb.Append(s);
}
return sb.ToString().ToUpper();
}
,同理,我们也可以定义一个HEXTORAW将16进制表示的字符串转换成byte[]数组方便插入数据库。
[c-sharp] view
plaincopy
static byte[] HEXTORAW(string str)
{
if (str.Length % 2 == 0)
{
byte[] b = new byte[str.Length / 2];
int j = 0;
for (int i = 0; i < str.Length; i += 2)
{
byte by = Convert.ToByte(str.Substring(i, 2), 16);//取两个字符,转换成对应的字节
b[j] = by;
j++;
}
return b;
}
else
{
throw new Exception("不能将该字符串转换成RAW类型");
}
}
我们知道Oracle中有函数RAWTOHEX(rawvalue),将RAW类数值转换成一个相应的16进制表示的字符串,rawvalue中的每个字节都被转换成为一个双字节的字符串。当我们给数据表中的ID定义成RAW(16)类型时,用RAWTOHEX(ID)得到的将是一个用16进制表示的字符串,该字符串的长度是32。同理RAW(8)得到的应该是一个长度为16的字符串。
ORACLE中有一个SYS_GUID()函数,返回的是唯一的16进制表示的字符串,长度也是32.因此我们可以给RAW(16)类型的ID设置默认值为:SYS_GUID(),但不能给字节数小于16的RAW类型设置SYS_GUID(),会提示长度超出范围。
接下来就是我遇到的问题了,通常我们在PL/SQL中写查询语句时都这么写:select ID from test,看到的ID显示为已经被RAWTOHEX过的数据,比如:A03BDB52E4800D74E044001321BD1C8B,但我们在C#中查询ORACLE数据库时,会将RAW(16)类型的ID返回为一个 byte[]数组,长度为16.这和我们在PL/SQL中看到的ID是不一样的。有时候在调试代码时想看看这个ID是不是我们想要的ID时很不方便。因此我们有必要吧这个数组转换成和PL/SQL中一样的数据显示。
我们上面已经了解到这个byte[]数组中的每一个byte都被转换成了一个双字节的字符串,我们在C#中也定义一个RAWTOHEX函数,如下:
[c-sharp] view
plaincopy
static string RAWTOHEX(byte[] b)
{
StringBuilder sb = new StringBuilder();
foreach (byte by in b)
{
string s = Convert.ToString(by, 16);//将字节转换成对应的字符
if (s.Length==1)
{
s = "0" + s;//当字符不足两位时,在前面补0,补足两位字符,因为字符串“01”转换成的字节为1,而将字节再转换成字符串的时候就变成了“1”,因此要补0
}
sb.Append(s);
}
return sb.ToString().ToUpper();
}
,同理,我们也可以定义一个HEXTORAW将16进制表示的字符串转换成byte[]数组方便插入数据库。
[c-sharp] view
plaincopy
static byte[] HEXTORAW(string str)
{
if (str.Length % 2 == 0)
{
byte[] b = new byte[str.Length / 2];
int j = 0;
for (int i = 0; i < str.Length; i += 2)
{
byte by = Convert.ToByte(str.Substring(i, 2), 16);//取两个字符,转换成对应的字节
b[j] = by;
j++;
}
return b;
}
else
{
throw new Exception("不能将该字符串转换成RAW类型");
}
}
相关文章推荐
- 从 ORACLE的RAWTOHEX到C#的RAWTOHEX
- Oracle hextoraw和rawtohex
- Oracle常用函数之HEXTORAW & RAWTOHEX
- Oracle hextoraw和rawtohex
- oracle常用函数之HEXTORAW & RAWTOHEX
- HOW TO SETUP ORACLE ON A RAW PARTITION
- oracleasm failed to createdisk on raw device
- 【原创】公司一款IC的HEX TO BIN (C#)-----2008.07
- Oracle中夸库查询表数据以及RAW(20),guid.native与c#Guid之间转换知识
- C# int 转 16进制的字符串 in to hex string
- C# oracle to_date 日期型 参数传值
- Oracle Error : ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 3000, maximum: 4000)
- c#中oracle的to_date函数使用方法
- oracleasm failed to createdisk on raw device
- How To Use a DataReader Against an Oracle Stored Procedure in Visual C# .NET
- How to send raw data to a printer by using Visual C# .NET
- C# how connect to oracle!
- [导入]Using Raw Input from C# to handle multiple keyboards
- Using Raw Input from C# to handle multiple keyboards
- c#小工具,位序批量转换工具,hex到hex。bit order converter,hex to hex