一个编码储存的问题,急!!高分相送,谢谢

gatesxie 2004-01-08 11:57:38
对一个矩阵编码,编码后,例如:A=10001111,B=1010011,........
A的数据类型为CString,
如何把A,B,.....这些字符串转化成按位存储,也就是说把A,B.....存到硬盘中,按位进行存储,而不是按字符.

最好给出代码,小弟先谢谢大家了
...全文
40 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
chehw 2004-01-09
  • 打赏
  • 举报
回复
(二)读取时采用以下算法:
...
(2)若cb>=0,则该字节本身即为编码。令val[0]=cb; cb=0; 执行(5)

chehw 2004-01-09
  • 打赏
  • 举报
回复
如果你的编码长度小于128个字节,可考虑如下存储方案:
在每个编码前附加1个或0个字节,附加字节的最高位置为1
(一)写入时采用下面的算法:
1、当编码为1个字节时:
(1)若最高位为0,则无需添加附加字节, 直接写入编码。
(2)若最高位为1,则: 附加字节=10000000|1;先写入附加字节,再写入编码。
2、当编码为n个字节时(128>n>1),附加字节=10000000|n; 先写入附加字节,再写入编码。

(二)读取时采用以下算法:
分配一个char型的数组 char val[128];//读取编码
分配一个char型的变量 char cb;//读取附加字节
(1)从文件读一个字节到cb;
(2)若cb>=0,则该字节本身即为编码。令val[0]=cb; 执行(5)
(3)若cb==-1,则后面的编码长度为1个字节,且高位为1。令cb=1, 读取一个字节至val[0], 令val[0]=-val[0]; 执行(5)
(4)若cb<-1, 则cb=-cb, 读取cb个字符到val, 执行(5)

(5) 转换val[0]至val[cb-1]个编码为字符串形式,若!EOF则重复执行(1),否则结束。



zhangcrony 2004-01-09
  • 打赏
  • 举报
回复
掉個字﹐好象我沒必要再說什么了吧?
zhangcrony 2004-01-09
  • 打赏
  • 举报
回复
好象我必要再說什么了吧?
nonocast 2004-01-09
  • 打赏
  • 举报
回复
够详细的了

May you succeed!
gatesxie 2004-01-09
  • 打赏
  • 举报
回复
谢谢chehw和花差花差 ,现在的问题是我的编码有可能是不定长的,如果这样的话我如何实现从硬盘中读取并转换,我的想法是建一个标志位,标志下次要读入多少个字节,可是这样的话,又要占用大量多余的储存空间
gatesxie 2004-01-08
  • 打赏
  • 举报
回复
谢谢,那存成文件后的解码呢!!!

fzd999 2004-01-08
  • 打赏
  • 举报
回复
先把CString转成字符串
int nLen = strA.GetLength() + 1;
char *Buf = new char[nLen];
memcpy(Buf, strA.GetBuffer(nLen);

然后遍历并存储
int nNumByte = (0 == ((nLen - 1)%8) ? nlen/8 : nLen/8 + 1);
BYTE *ByteBuf = new char[nNumByte];
ZeroMemory(ByteBuf, nNumByte);
BYTE bTmp = 0x01;

for (int i = 0; i < nNumByte; i++)
{
for (int j = 0; j < 8; j++)
{
if (Buf[i*8 + j] == '\0')
{
break;
}
if (Buf[i*8 + j] == '1')
{
ByteBuf[i] |= bTmp<<j;
}
}
}

存成文件不用我教你了吧?
hahu 2004-01-08
  • 打赏
  • 举报
回复
保存的时候就是按位阿

还是打开文本的时候看到二进制编码的文本

CString str="hello";
CString str2;
char *p;
str2.Format("%x",str);
LONG l;
l=strtol(str2.GetBuffer(0),&p,16);
_ltoa(l,str2.GetBuffer(100),2);
AfxMessageBox(str2);
str2.ReleaseBuffer();
chehw 2004-01-08
  • 打赏
  • 举报
回复
CString A, B;//A=10001111,B=1010011,........

LPBYTE a, b;

a=(LPBYTE)(LPCTSTR)A;
b=(LPBYTE)(LPCTSTR)B;

BYTE valA=0; //相对于A的一个8位整数
BYTE valB=0;//相对于B的一个8位整数


char ch;
while(ch=*a)
{
valA+=ch;
valA<<1;
a++;
}

while(ch=*b)
{
valB+=ch;
valB<<1;
b++;
}

再保存valA和valB到文件。

还原方法相当于把一个8位整数写为二进制字符串的形式。
BYTE val;
从文件中一次读取1个字节到val中。

TCHAR szVal[9]="";
int i=0;
while(val)
{
szVal[i++]=(val%2)+0x30;
val>>=1;
}
szVal[i]=0x31;
szVal[i+1]=0;

//反转字符串
int j;
for(j=0;j<(i+1)/2;j++)
szVal[j]=szVal[i-j];

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧