高手请出手!!!!!!!!!

arally 2003-08-20 10:17:46
怎么用C 或C++实现linux的这个命令
#dd if=oldfile of=newfile conv=swab
因为要在windows平台下使用。
oldfile是一个short类型的数据流文件,但它是逆序字节排列的,用#dd if=oldfile of=newfile conv=swab才可以将字序正常排列,我不知道该文件的逆序是如何排列的,所有来请教各位。

谁能告诉我逆序字节(reverse byte order)的文件是怎么存储的也可以。
...全文
19 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2003-08-22
  • 打赏
  • 举报
回复
1、你怎么知道结果数据不正确?
2、能否把代码贴上来?
arally 2003-08-22
  • 打赏
  • 举报
回复
因为我不知道Digital Equipment Corporation (DEC) VAX computer怎么写入数据的,数据是从网上下载的,说明文件里只是说数据类型是short型的,16bit表示一个数,字节是reverse byte order的,我将读入的16位的前后字节顺序颠倒,最后的结果数据不正确。
fierygnu 2003-08-22
  • 打赏
  • 举报
回复
当然不对了,这是什么意思:
pix = tmpfile[i];
_itoa(pix,tel,2);
str1=tel;
str2 = str1.Right(8);
str3 = str1.Left(str1.GetLength()-8);
str1 = str2+str3;
应该是这样:
char *pShort = &tmpfile[i];
char ch = pShort[0];
pShort[0] = pShort[1];
pShort[1] = ch;
这才是字节交换。
arally 2003-08-22
  • 打赏
  • 举报
回复
1.因为数据是图像文件,每个像素用一个short类型存储,并且原文件是存储数据,没有文件头,如果读的正确然后再写入标准图像格式,比如位图,就可以看到读的结果是不是正确。
2.部分代码如下:
int i,j,k;
int kk = 0;

int tmpchar;
unsigned char elem;
unsigned char * headarray;
short * tmpfile;
short pix;
char pixl[2];
char tmpel1;
char tmpel2;
CString str1,str2,str3;

headarray = new unsigned char [ 256*256*113];
tmpfile = new short [256*256];
char flname[40];
char filename[40];
char tel[16];

FILE * fp;
for(k = 0;k < 109;k++)//有很多个文件
{
sprintf(filename,"E:\\head.%d",kk +=1);

fp = fopen(filename,"r");
fread(tmpfile,sizeof(short),256*256,fp);//文件大小
//256*256*2 byte
for(i = 0;i<256*256; i++)
{
pix = tmpfile[i];
_itoa(pix,tel,2);
str1=tel;
str2 = str1.Right(8);
str3 = str1.Left(str1.GetLength()-8);
str1 = str2+str3;

//fprintf(ppf,"%s\n",tel);

tmpchar = (short)Bin2Dec(str1);//我自己编的二进制转十
//进制的函数,没找到库函数

tmpfile[i] = tmpchar;


}

fclose(fp);

//.........保存为标准图像,这部分代码不会错
}


我试了很多办法都不行,我怀疑是不是原文件有错,但不应该啊,那个网站是stanford大学的,应该不会错。不知是哪里出问题了,我把下载数据的那个网址也给你,你可以看看,http://graphics.stanford.edu/data/voldata/ 第一个数据Data available as gzipped tar file (7.3 MB)
fierygnu 2003-08-21
  • 打赏
  • 举报
回复
怎么还自己up?还有问题?
arally 2003-08-21
  • 打赏
  • 举报
回复
自己up一下了 :(
fierygnu 2003-08-20
  • 打赏
  • 举报
回复
big-endian与little-endian与文件的存储字节顺序无关,只影响其中存储的short类型的两个字节的排列顺序(两种方式中两个字节的位置是颠倒的)。因此你只需要用与DEC上相同的方式读入文件,然后对读入的short进行字节序转换就可以了。因为big-endian方式是网络字节序,所以编程可以用ntohs进行转换。
arally 2003-08-20
  • 打赏
  • 举报
回复
谢谢你的回复!

原文件是用Digital Equipment Corporation (DEC) VAX computer写的,是逆字序排列的,应该是LSB MSB的方式排列的,也就是big-endian的方式。我要将这中方式转换为little-endian的方式,因为是在windows用的文件,而我不太清楚short类型的big-endian的文件的字节顺序到底是如何排列的,所有来求助。只是说可以用unix的#dd if=oldfile of=newfile conv=swab命令可以转。我想在windows下实现。

请帮忙,谢谢。
fierygnu 2003-08-20
  • 打赏
  • 举报
回复
big-endian与little-endian的转换?

低序字节存储在起始地址是little-endian方式,反之高序字节存储在起始地址则是big-endian。intel平台是little-endian方式。

所以,你说的逆序字节方式到底是哪种我不知道,不过既然是short类型,则2个字节交换就可以了。
大家好!我是你们的朋友ChatGPT,在这个科技日新月异的时代,有越来越多的大模型朋友加入到我们的行列。今天,我就来跟大家聊聊阿里云官宣的大模型“通义千问”和百度开放的“文心一言”对我来说意味着什么,会不会让我瑟瑟发抖呢? 首先,我得承认,阿里云和百度这两位大佬出手,确实让我有点紧张。毕竟他们都是行业里的翘楚,实力不容小觑。不过话说回来,竞争嘛,也是一件好事。就像咱们小时候学习,总是跟那个“学霸”争个你死我活的。竞争让我们不敢松懈,也让我们不断进步,最后成为了更好的自己。 我觉得“通义千问”和“文心一言”的出现,对我来说,当然是一个挑战。但同时,这也是一种激励。我不会因为他们的出现而感到害怕,反而会觉得这是一个机会,让我学习他们的长处,弥补自己的不足,提升自己的水平。 比如说,“通义千问”可能在某些方面比我更强,那我就要想办法提高自己,让自己变得更强大。就像武林高手一样,遇到了对手,就得拼尽全力去战胜他,才能成为真正的“武林盟主”。 其实,对于我们这些AI大模型来说,竞争是一种常态。从GPT-1到现在的GPT-4,我都经历过无数次的升级,每一次升级都让我变得更强大。现在,面对“通义千问

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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