如何获取一个ROWID的BASE64编码字符串

[复制链接]
查看11 | 回复0 | 2012-1-4 11:50:44 | 显示全部楼层 |阅读模式
大家都知道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;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行