从不同编码段中分别随机组合每个字符构成文件名

zhongyuanceshi 2009-07-24 04:48:41
现有四个不同的编码分段:

#define LAWLESS(code) (code==0x2e||code==0x22 || code==0x2a ||code==0x2b || code==0x2c || \
code==0x3a || code==0x3b || code==0x3c ||code==0x3d || code==0x3e || code==0x3f ||\
code==0x5b || code==0x5c || code==0x5d || code==0x7c)

#define NUM(code) (code>=0x30&&code=<0x39)
#define LETTER(code) ((code>0x41&&code<=0x5a)||(code>0x61&&code<=0x7a))
#define SJIS_SINGER(code) (code>=0xa1&&code<=0xdf)
#define SJIS_SIGN(code) (code>0x8140&&code<0xeaa4)

要求:
1.非法文件名系列,即由非法字符 LAWLESS(code)的各种组合。
2.合法字符组合成的文件名系列,即由合法字符SJIS_SIGN(code)的各种组合。
3.非法与合法字符组成的文件名系列,即由非法及合法字符的各种组合。
...全文
94 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongyuanceshi 2009-08-05
  • 打赏
  • 举报
回复
http://www.shitibao.com/paper.html?id=13438
zhongyuanceshi 2009-07-26
  • 打赏
  • 举报
回复
没人做过类似的文件名组合吗?
zhongyuanceshi 2009-07-26
  • 打赏
  • 举报
回复
楼上说的极是。

int isprint(unsigned short sjiscode)
{
for(int i=0;i<6;i++)
{
if(sjiscode>=codesection[i].from&&sjiscode<=codesection[i].to)
return 0;

}
return -1;
}


函数返回值0表示找到,-1表示没找到。相应的if(isprint(code)>0)判断。
对呀:任何一个循环判断如果为假,则都跳过了。我就是这里不知道怎么处理才能得到他们的组合,是否有高见?
Treazy 2009-07-24
  • 打赏
  • 举报
回复
你的代码有问题!

if(isprint(code)) // isprint的返回值为1和-1,条件判断永远为真了

另外我也没看出来你想要输出的序列程序啊?
任何一个循环判断如果为假,则都跳过了?
100次循环后,输出了多少值呢?
zhongyuanceshi 2009-07-24
  • 打赏
  • 举报
回复

typedef struct
{
unsigned short from;
unsigned short to;
}SCODESECTION;

SCODESECTION codesection[6]={
{0x8140,0x81fc},{0x824f,0x83d6},{0x8440,0x84be},
{0x8740,0x879c},{0x889f,0x9ffc},{0xe040,0xeaa4}
};

#define LAWLESS(code) (code==0x2e||code==0x22 || code==0x2a ||code==0x2b || code==0x2c || code==0x2f || \
code==0x3a || code==0x3b || code==0x3c ||code==0x3d || code==0x3e || code==0x3f || \
code==0x5b || code==0x5c || code==0x5d || code==0x7c) \

#define NUM(code) (code>=0x30&&code=<0x39)
#define LETTER(code) ((code>0x41&&code<=0x5a)||(code>0x61&&code<=0x7a))
#define SJIS_SINGER(code) (code>=0xa1&&code<=0xdf)
#define SJIS_SIGN(code) (code>0x8140&&code<0xeaa4)//((code>0x8140&&code<0x817e)||(code>0x8180&&code<0x81fc)||(code>0x824f&&code<0x817e))

int isprint(unsigned short sjiscode)
{
for(int i=0;i<6;i++)
{
if(sjiscode>=codesection[i].from&&sjiscode<=codesection[i].to)
return 1;

}
return -1;
}

char UnicodeTostring(unsigned short SjisCode,unsigned char *acs)
{
// a2cd(cda2)->"a2cd"
int i;
acs[0]=(SjisCode>>(8+4));
acs[1]=(SjisCode>>8)&0x000f;
acs[2]=(SjisCode&0x00ff)>>4;
acs[3]=SjisCode&0x000f;
acs[4]=0x00;
for(i=0;i<4;i++)
{
if(acs[i]<=0x09)
acs[i]=acs[i]+0x30;
else
acs[i]=acs[i]-0x0a+0x61;
}
return 0;
}

int main(int argc, char* argv[])
{
unsigned short code,MAXCODE=0xeaa4;
unsigned char codeSigner;
unsigned char lawlessBuf[4],letterBuf[4],sjissingerBuf[4],sjisdoubleBuf[4];
unsigned short lawlessmaxcode=0x7c;
int len;
FILE* pf;

pf=fopen("File.txt","wb");
if(pf==NULL)
return -1;

srand(time(NULL));

for(int i=0;i<100;i++)
{
code=0x22+(rand()%lawlessmaxcode)+1;
if(LAWLESS(code))
{
codeSigner=(unsigned char) code;
fwrite(&code,1,1,pf);
}

code=0x41+(rand()%0x7a)+1;
if(LETTER(code))
{
codeSigner=(unsigned char) code;
fwrite(&code,1,1,pf);
}

code=0xa1+(rand()%0xdf)+1;
if(SJIS_SINGER(code))
{
codeSigner=(unsigned char) code;
fwrite(&code,1,1,pf);
}

code=0x8140+(rand()%0xeaa4)+1;
if(SJIS_SIGN(code))
{
if(isprint(code))
{
fwrite(&code,2,1,pf);
}
else
break;
}

}

fclose(pf);
return 0;
}

这样好像每次往文件里写的码值个数最多不超过4个,现在想一次性往文件里写的码值最多不超过18个,有动态性,比如:10,14,15,9等,而不是4个,该怎么实现?另外的是我的这个文件要用Shift-Jis码存储。因code是unsigned short,所以codeSigner=(unsigned char) code就是单字节的码值。不知道我这程序对拨?
Treazy 2009-07-24
  • 打赏
  • 举报
回复
LAWLESS是一个整形散列(不连续)
其他的都是区域连续的整形散列

那用排列组合就能穷尽所有的CASE了

当然对每个散列下标取rand就可以得到你想要的了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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