返回信息流今天看到如下的一个C代码:
#include <stdio.h>
int main(void)
{
FILE* fphzk = NULL;
int i, j, k, offset;
int flag;
unsigned char buffer[32];
unsigned char word[3] = "我";
unsigned char key[8] = {
0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01
};
fphzk = fopen("HZK16", "rb");
if(fphzk == NULL){
fprintf(stderr, "error HZK16\n");
return 1;
}
offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;
fseek(fphzk, offset, SEEK_SET);
fread(buffer, 1, 32, fphzk);
for(k=0; k<32; k++){
printf("%02X ", buffer[k]); //第22行
}
printf("\n");
fclose(fphzk);
fphzk = NULL;
return 0;
}
运行结果如下:
由于本人喜欢C++,就想把它改写成C++代码,第一次改成如下形式(由于原C代码的第22行不知道怎么改就先保留了):
#include<iostream>
#include<fstream>
#include<iomanip>
#include <stdio.h>
using namespace std;
int main()
{
int i, j, k, offset;
int dc;
unsigned char buffer[32];
unsigned char word[3] = "我";
unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;
ifstream ifile("HZK16",ios::in);
if(ifile.fail())
{
cout<<"HZK16 open fail!"<<endl;
return 1;
}
ifile.seekg(offset,ios::beg);
ifile.read(buffer,32); //21行
for(k=0; k<32; k++){
printf("%02X ", buffer[k]);
}
cout<<endl;
ifile.close();
return 0;
}
结果程序运行不出,错误描述为第21行有问题:
好像意思就是 如果buffer设成unsigned的话21行就不能执行。
所以我就把第10行buffer前面的unsigned去掉,即把代码改成:
#include<iostream>
#include<fstream>
#include<iomanip>
#include <stdio.h>
using namespace std;
int main()
{
int i, j, k, offset;
int dc;
char buffer[32];
unsigned char word[3] = "我";
unsigned char key[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
offset = (94*(unsigned int)(word[0]-0xa0-1)+(word[1]-0xa0-1))*32;
ifstream ifile("HZK16",ios::in);
if(ifile.fail())
{
cout<<"HZK16 open fail!"<<endl;
return 1;
}
ifile.seekg(offset,ios::beg);
ifile.read(buffer,32);
for(k=0; k<32; k++){
printf("%02X ", buffer[k]);
}
cout<<endl;
ifile.close();
return 0;
}
运行后结果是:
与c代码的输出不太一样...
所以我想请教大神们:
1.我的方法哪里错了?需要怎么改?
2.原c代码的22行应该怎么改成C++的流形式(即不用printf,用cout)
以下是HZK16文件:
附件(261.3KB) HZK16
这是一条镜像帖。来源:北邮人论坛 / cpp / #93849同步于 2016/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[问题]把C代码改成C++代码过程中遇到问题...
flgkd
2016/11/4镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
你只需要把printf输出的char字节转换为unsigned char就可以了。
printf第一个参数X规定了输出类型是无符号16进制整型数,char默认是有符号的,转到int会出现高位补齐的情况。
【 在 youngsc 的大作中提到: 】
: 你只需要把printf输出的char字节转换为unsigned char就可以了。
: printf第一个参数X规定了输出类型是无符号16进制整型数,char默认是有符号的,转到int会出现高位补齐的情况。
谢谢大神~按你说的的修改后可以了
Python大法好
尤其是涉及到汉字字符编码的问题,C语言一塌糊涂。
【 在 wdjwxh 的大作中提到: 】
: 不遗余力的推广
: ~ 我也想学python
python2也感觉一蹋糊涂。。
现在RHEL和centos系上还是python2.6作为底
有时写个啥也不好用
【 在 nuanyangyang 的大作中提到: 】
: Python大法好
: 尤其是涉及到汉字字符编码的问题,C语言一塌糊涂。
: