大家都知道rowid是由
object object number,
relative file number,
block number,
slot number
四个部分组成,
如果想插入ROWID,通常可以通过DBMS_ROWID程序包里面的过程返回一个合法的ROWID,
但是也可以通过base64编码的字符串的形式插入,比如
INSERT INTO TEST (ROWID_) VALUES('AAAAAAFAAAUABQAT1s');
其中‘AAAAAAFAAAUABQAT1s’,是一串18个字节长的base64编码的字符串,
我想在已经知道这18个字节的字符串的格式如下:
OOOOOO.FFF.BBBBBB.SSS
O: Data Object Number;
F:Relative File Number;
B:Block Number;
S:Slot number;
我通过程序,讲O,F,B,S四个部分分别转换成对应的base64编码字符串,正好是18个字节,但是通过INSERT插入后再选出,发现得到的O,F,B,S已经不是原来的值了。
不知道什么地方有问题。
--下面是转换的程序------
#include "stdafx.h"
#include "atlenc.h"
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
void encodeblock( unsigned char *in, unsigned char *out, int len )
{
out[0] = cb64[ in[0] >> 2 ];
out[1] = cb64[ ((in[0] & 0x03) > 4) ];
out[2] = (unsigned char) (len > 1 ? cb64[ ((in[1] & 0x0f) > 6) ] : '=');
out[3] = (unsigned char) (len > 2 ? cb64[ in[2] & 0x3f ] : '=');
}
int CvtRowID2Base64( char* pRaw, char*pOut )
{
unsigned int objectn = 0;
unsigned int dba = 0;
unsigned short fno = 0;
unsigned int blkno = 0;
unsigned short slot = 0;
char buf[4];
int szdst;
buf[0] = pRaw[3];
buf[1] = pRaw[2];
buf[2] = pRaw[1];
buf[3] = pRaw[0];
objectn = *(unsigned int*)(buf);
buf[0] = pRaw [sizeof(int) + 3 ];
buf[1] = pRaw [sizeof(int) + 2 ];
buf[2] = pRaw [sizeof(int) + 1 ];
buf[3] = pRaw [sizeof(int) + 0 ];
dba = *(unsigned int*)(buf);
fno = dba/4194304;
blkno =dba >10;
buf[0] = pRaw[9];
buf[1] = pRaw[8];encodeblock((unsigned char*)&slot,(unsigned char*)pOut + 15, 2);
slot = *(unsigned short*)( buf );
szdst = 10;
ATL::Base64Encode((const BYTE*)&objectn,4,(LPSTR)pOut,&szdst,ATL_BASE64_FLAG_NOPAD);
szdst = 10;
ATL::Base64Encode((const BYTE*)&fno,2,(LPSTR)pOut+6,&szdst,ATL_BASE64_FLAG_NOPAD);
szdst = 10;
ATL::Base64Encode((const BYTE*)&blkno,4,(LPSTR)pOut+9,&szdst,ATL_BASE64_FLAG_NOPAD);
szdst = 10;
ATL::Base64Encode((const BYTE*)&slot,2,(LPSTR)pOut+15,&szdst,ATL_BASE64_FLAG_NOPAD);
pOut[18] = 0;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char in[10];
char out[50];
memset(out,'0',sizeof(out));
//原始数据,从ROW DUMP中拿出来的
in[0] = 0x0;
in[1] = 0x0;
in[2] = 0x0;
in[3] = 0x0;
in[4] = 0x40;
in[5] = 0x01;
in[6] = 0x0;
in[7] = 0x5;
in[8] = 0x0;
in[9] = 0x5;
CvtRowID2Base64(in,out);
return 0;
} |