ASCII码超出0-127范围问题

sweedy_cool 2009-01-08 04:30:37
想要读取超出ascii常规字符集的范围0-127怎么办? 比如字符ü 对应的ascii码应该是129,也就是十六进制81。认为是
...全文
1448 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
我快疯了,其实很简单的问题。
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复

都不好意思继续问了,不知道你们能不能看到图片,上面我贴的数据:
0 k
0 m
0 o
0 q
0 s
0 u
0 w
0 y
0 {
0
}
0 
0 ?
最后一行的“?”不是真正的问号,不是十六进制3F,而应该是十六进制81,但是显示为“?”问号。那个TXT中后面还有很多,凡是“?”问号,它都认为是十六进制3F。 TXT中有很多.......,其实不是黑点,但是一些其他的字符,比如NUL和SOH,都显示为黑点,但是这个就能正确地反映出来,0 和1。 TXT中还有乱七八糟的汉字,也都能正确地显示
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
谢谢各位,你们说的都对!! 我理解有问题了,非常感谢wutaihua等朋友。这些数据的来源都是超级终端,它本身就不识别后128位ASCII码,所以它都用?来表示,也就是3F。
lpcii 2009-01-08
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
FILE* fp;
unsigned char a = 129;

fp = fopen("test.txt" , "wb");
fwrite(&a , sizeof(unsigned char) , 1 , fp);
fclose(fp);

fp = fopen("test.txt" , "rb");
fread(&a , sizeof(unsigned char) , 1 , fp);
fclose(fp);

printf("%d\n" , (int)a);

return 0;
}


看看这个能不能帮助你
lhsxsh 2009-01-08
  • 打赏
  • 举报
回复
了解了
wutaihua 2009-01-08
  • 打赏
  • 举报
回复
你是可以读,但是你展现的方式不对啊。
你以unsigned char的方式来读取,然后你转换为16进制,然后转换为字符串,代码如下


#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
FILE *fp;
long flen,bint[500],i;


fp = fopen("c:\\bsmain_runtime.log", "rb");
fseek(fp,0,SEEK_END);
flen=ftell(fp);
fseek(fp,0,SEEK_SET);

unsigned char *p,*s; //????????????,????0-255??ascii?
p=(unsigned char*)malloc((flen+1)*sizeof(unsigned char));
fread(p,1,flen,fp);


for(i=0;i <flen;i++)
{
printf("%x\t",*(p+i)); //??????
}
printf("\n\n");
for(i=0;i <flen;i++)
{
bint[i]= (long)(*(p+i));
printf("%d ",bint[i]);
}

}


我都帮你运行过了
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
TXT中的字符就是这些:0 k
0 m
0 o
0 q
0 s
0 u
0 w
0 y
0 {
0
}
0 
0 ?
这些字符中00-7F的都可以读出
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
谢谢各位,真不好意思,可能我没说清楚,我要读的字符是从00-ff个一共256个,现在我只能读出00-7F,这些“乱”码都放在txt里面,比如其中一个是ü,我就返回81
wutaihua 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sweedy_cool 的回复:]
什么意思啊? 0-127都可以这么实现,超过这个范围就不成了。我就是想把ü,读出显示出十六进制81就OK了
[/Quote]

可以啊,你看到的ü是字符形式,你直接用整数形式来读取就可以了啊

char a, b, c;
a = 30;
b = 0x80;
c = 0x81;
CString str;
str.Format("a = %c, b = %c, c = %c", a, b, c);//以字符形式输出
afxMessageBox(str);
//这个时候你只会看到a b,c都是乱码。
但是你这样输出:
str.Format("a = %d, b = %d, c = %d", a, b, c);//以10进制整数输出
afxMessageBox(str);
//这个时候看到的就是a,b,c对应的值的10进制显示
str.Format("a = %x, b = %x, c = %x", a, b, c);//以16进制输出
afxMessageBox(str);
//这个时候看到的就是a,b,c对应的值的16进制显示
一名程序员 2009-01-08
  • 打赏
  • 举报
回复
直接输出printf("%ux",c)就行了
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
什么意思啊? 0-127都可以这么实现,超过这个范围就不成了。我就是想把ü,读出显示出十六进制81就OK了
菜牛 2009-01-08
  • 打赏
  • 举报
回复
数值是多少就是多少,而编码,在你显示的时候才有意义,比如字体等。
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
FILE *fp;
long flen,bint[500],i;
fp = fopen("c:\\a.txt", "rb");
fseek(fp,0,SEEK_END);
flen=ftell(fp);
fseek(fp,0,SEEK_SET);
unsigned char *p,*s; //定义无符号字符型变量指针,希望能从0-255读出ascii码
p=(unsigned char*)malloc((flen+1)*sizeof(unsigned char));
fread(p,1,flen,fp);
for(i=0;i<flen;i++)
{
if(*(p+i)==' ') //遇到空格认为是空NULL
*(p+i)=0;
printf("%x ",*(p+i));
}
printf("\n\n");
for(i=0;i<flen;i++)
{
printf("%c",*(p+i));
}
printf("\n\n");
for(i=0;i<flen;i++)
{
bint[i]= (long)(*(p+i));
printf("%d ",bint[i]);
}

}
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
各位大哥说具体一点啊,谢谢
sweedy_cool 2009-01-08
  • 打赏
  • 举报
回复
好像还不可以啊,没有任何变化
luowin 2009-01-08
  • 打赏
  • 举报
回复
话没说完吧,认为是。。。。。。。;你就当整形数存,宽字符取
qq14923349 2009-01-08
  • 打赏
  • 举报
回复
unsigned char

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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