作者leslieha (懂的付出才會幸福)
看板C_and_CPP
標題Re: [問題] c讀取非文字檔,輸出add,16進制,ASCII
時間Tue Jul 6 19:13:11 2010
: 標題: [問題] c讀取非文字檔,輸出add,16進制,ASCII
: 時間: Mon Jul 5 22:18:07 2010
:
:
: 遇到的問題: (題意請描述清楚)
:
: 現在已經寫出來可以讀取文字檔(.TXT之類的)
:
:
: 但要如何修改才也能夠讀取非文字檔(.exe之類)
: 現在讀取非文字檔都會出現亂碼~"~
:
: 希望得到的正確結果:
:
下面是讀取文字檔的輸出結果
:
:
: address 16進制碼 ASCII
:
: 00000010 70 72 30 30 30 30 30 30 30 30 30 30 30 30 30 30 pr00000000000000
: 00000020 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
: 00000030 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000
:
: 程式跑出來的錯誤結果:
:
: 讀取非文字檔..16進制跟ASCII那都會跑出亂碼或怪東西
讀取非文字檔使用推文內教的rb去讀取
但還是一樣..16進制那會跑出FFFFFFAB<<類似這種一大串東西(用%02X輸出的)
ASCII會跑出亂碼(用%c輸出)
跟正確程式比對後發現我的都會跑出FFFFFF**,而且ASCII那還有亂碼
正確的只會顯示 **,ASCII不會出現亂碼
:
: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
:
: VC++
:
: 有問題的code: (請善用置底文標色功能):
int re;
struct clientdata client; // 你的struct clientdata真的剛剛好16-byte嗎?
// 有byte alignment嗎?
printf("File name : ");
scanf("%12s", filename ); /* 讀取輸入檔名 */
fp = fopen( filename, "rb");
if( fp == NULL ) /* 判斷是否開啟成功 */
printf("Cannot open \n",filename);
^ 少寫 %s ?
else
{
while(!feof(fp))
{ /* 判斷檔案內有無資料 */
//struct clientdata client={""}; /* 清空陣列 */
memset(&client, 0, sizeof(struct clientdata));
re = fread(&client,sizeof(struct clientdata),1,fp);/* 讀取字元 */
//if(client.ch !=0)
// 確定有讀這麼多size
if(re == sizeof(struct clientdata))
{
printf("%07X0 ",index); /* 輸出address */
for(i=0;i<16;i++)
{
printf("%02X ", (char)client.ch[i]);/* 輸出16進制碼 */
// ch[]是char形態嗎?
} /* end for */
for(i=0;i<16;i++)
{
if (isprint(client.ch[i]))
printf("%c",(char)client.ch[i]); /* 輸出ASCII碼 */
else
printf(".");
} /* end for */
printf("\n");
} /*end if */
else
{
printf("fread size error\r\n");
}
index=index++;
} /* end while */
fclose(fp);
: 補充說明:
:
目前想到的是會不會要先把檔案內容轉成2進制,再轉成16進制?..似乎挺麻煩的
還是有更好的辦法?
幾進制
應該只差別在顯示吧?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.251.160.61
→ LPH66:你可以推文 07/06 19:34
→ leslieha:因為有改寫些code 所以沒推文 07/06 22:29