廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5268 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
csr
個人文章 個人相簿 個人日記 個人地圖
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x0 鮮花 x898
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] 無緩衝區的輸入與輸出
/* 程式名稱 : ch13_22.c */
/* 隨機讀取某檔案的 16 位元資料 */
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
int main(int argc, char *argv[])
{
long pos;
int fd;
int sector;
int totalread,totaldigit,totalchar;
int i,j;
char buffer;請教大大,這64是否代表64位元嗎?

fd = open(argv,O_RDONLY | O_BINARY);
while ( 1 )
{
printf("輸入磁區 ");這裡的磁區,怎會是檔案的第一行,而不是磁碟的第x磁區呢?
scanf("%d",§or);
if ( sector < 0 )
{
printf("結束隨機讀取資料 \n");
break;
}
pos = (long) sector * 64;請教這裡64 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容




獻花 x0 回到頂端 [樓 主] From:臺灣中華電信股份有限公司 | Posted:2011-05-29 21:47 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片




應該是這樣,如果有錯誤還請大家指教

我最近才剛學 C 而已,不是很熟...


buffer 一次讀 64 個位元組,就是以上的圖中,四個 16 bytes 的橫框框的範圍

然後以 char 一位元組為單位讀取 buffer[i*16+j] ,i 是小藍框框的左邊起始點 位移量,而 j 是在 小藍框框 內的位移量


我又畫了一張





我看了許久,他好像是要模擬 UltraEdit 那樣,左邊顯示 16 個 %3x 的 16 位元碼,然後右邊顯示 16 個 %c 的字元,接著換行

讀取是一次讀 64 個位元組
但是顯示的時候一行只顯示 16 個位元組,你也可以把它改成 32 個位元組
所以是把一次的讀取量 切成 4 塊來顯示


還有,buffer[64] 是 64 位元組,而非位元,C 裡面像是 sizeof() 得到的都是 "位元組",就是 8 個位元組成的

1 byte = 8 bits


[ 此文章被ebolaman在2011-06-02 22:28重新編輯 ]

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


My BOINC stats :

獻花 x3 回到頂端 [1 樓] From:台灣寬頻通訊顧問股份有限公司 | Posted:2011-06-02 21:28 |
csr
個人文章 個人相簿 個人日記 個人地圖
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x0 鮮花 x898
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 ebolaman 於 2011-06-02 21:28 發表的 : 到引言文
[attachment=751600]

應該是這樣,如果有錯誤還請大家指教
我最近才剛學 C 而已,不是很熟...

.......
不好意思
大大的解釋
小弟似懂又非懂
也不知要怎麼來跟大大說出那裡不懂
不知大大可否用比較白話的方法幫小弟解釋
謝謝


獻花 x0 回到頂端 [2 樓] From:局域網對方和您在同一內部網 | Posted:2011-06-03 10:44 |
ebolaman 手機 會員卡
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎

級別: 副版主 該用戶目前不上站
版區: 程式設計
推文 x38 鮮花 x458
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 csr 於 2011-06-03 10:44 發表的 : 到引言文

不好意思
大大的解釋
小弟似懂又非懂
也不知要怎麼來跟大大說出那裡不懂
不知大大可否用比較白話的方法幫小弟解釋
謝謝


實作的話會更清楚,我們就拿我從 DesktopNexus 下載的桌布來當作 argv[1] 的字串目標

請將 圖片 Chromatic_link_by_k3_studio.jpg (附在此文章最下面) 放置到工作目錄下




另外請下載一套免費的 文字/十六進位 編輯軟體 (建議下載 Portable 的):RJ TextEd
點選底下的 Editor 並將這張桌布 直接拖曳進去,就可以檢視 十六進位碼




這是我 修改後的原始碼,用這個比較貼近 軟體顯示的方法:


複製程式
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
int main(int argc, char *argv[])
{
  long pos;
  int fd;
  int sector;
  int totalread,totaldigit,totalchar;
  int i,j;
  char buffer[64];

  argv[1]="Chromatic_link_by_k3_studio.jpg";


  fd = open(argv[1],O_RDONLY | O_BINARY);
  while ( 1 )
  {
    printf("輸入磁區 : ");
    scanf("%d",& sector);
      printf("\n");

    if ( sector < 0 )
    {
      printf("結束隨機讀取資料 \n");
      break;
    }
    pos = (long) sector * 64;
    if ( lseek(fd,pos,SEEK_SET) == -1 )
    {
      printf("隨機讀取資料錯誤 \n");
      break;
    }
/* 讀取 64 位元組資料如果讀不到這麼多表示已讀到檔案末端 */
    if ( ( totalread = read(fd,buffer,64) ) != 64 )
      printf("EOF : end of file.... \n");
    totalchar = totaldigit = totalread;
    for ( i = 0; i < ceil((float)totalread / 16); i++ )
    {
      for ( j = 0; j < 16; j++ )
      {
        totaldigit--;
        if ( totaldigit < 0 ) /* 無資料則列空白 */
          printf("   ");
        else         /* 否則輸出 16 進位值 */
          printf("%02X",buffer[i*16+j]<0 ? 255-(~buffer[i*16+j]) : buffer[i*16+j]);

          if (j&1==1)
            printf(" ");
      }

      printf("  "); /* 16 進位值和字元間的空白 */

      for ( j = 0; j < 16; j++ )
      {
        totalchar--;
        if ( totalchar < 0 )
          printf(" "); /* 輸出完成後用空白取代 */
        else
          if ( isprint(buffer[i*16+j]) )
            printf("%c",buffer[i*16+j]);/*輸出字元*/
          else       /* 非字元則用 . 取代 */
            printf(".");
      }

      printf("\n");
    }
    printf("\n");
  }



  close(fd);
  return 0;
}



(請用平面式 左到右 來想像檔案中的位元組)

首先,磁區開始 因為 lseek(fd,pos,SEEK_SET) 而被設定 位移量 將從 SEEK_SET 當作基準點

磁區為什麼要乘以 64? 因為他設定 buffer 一次要讀 64 個位元組,當然也可以設定不要乘以 64
那麼你輸入磁區的時候就要打 64, 128, 192 豈不是很麻煩

讀了 檔案中某一塊 64 的位元組後,接下來程式就是要顯示 這64個位元組資料 是什麼東西

他很想要模擬 UltraEdit 那樣一行顯示 16 個 16進位碼

請注意底下的像是 FFD8 其實是 2 個位元組 組成的,原本是要顯示 FF D8 但我想把他合在一起
十六進位的 FF 就是 十進位的 255 剛好是 2 的 8 次方-1 ,這就是 1 位元組有8個位元裝得下最大的數字 (unsigned) (最小是 0)



至於接下來除以 16 就是不想要一行 顯示 64 個,這樣會超出視窗範圍
因此他將 64 切成 4 塊 (顯示會顯示 4 行) 來顯示,64 / 4 = 16 ,這就是 16 的由來


至於 i*16+j 則是在 64 位元組內 的 位移量
在迴圈內 i*16+j 跑起來將會從 0~63 剛好一次讀一個位元組


至於達到 EOF 時候,buffer[i*16+j] 內是沒有讀到東西的
則將會顯示空白




你可以把 RJ TextEd 與 程式的結果來對照,請輸入 磁區 0 來比對比較輕鬆
將發現 16進位碼是 一模一樣

很有趣的,磁區2 裡面會看到 Adobe Photoshop CS2 甚至還有時間
他這張桌布是用哪個軟體編輯的還有儲存時間 都很明顯










Chromatic_link_by_k3_studio.jpg 桌布下載:


本帖包含附件
zip Chromatic_link_by_k3_studio.rar   (2022-06-09 14:18 / 681 KB)   下載次數:1


[ 此文章被ebolaman在2011-06-03 19:31重新編輯 ]

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


My BOINC stats :

獻花 x3 回到頂端 [3 樓] From:台灣寬頻通訊顧問股份有限公司 | Posted:2011-06-03 18:46 |
csr
個人文章 個人相簿 個人日記 個人地圖
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x0 鮮花 x898
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 ebolaman 於 2011-06-03 18:46 發表的 : 到引言文


實作的話會更清楚,我們就拿我從 DesktopNexus 下載的桌布來當作 argv[1] 的字串目標
請將 圖片 Chromatic_link_by_k3_studio.jpg (附在此文章最下面) 放置到工作目錄下
[attachment=751709]
.......
大大給予小弟如此詳細說明
總算能了解它地前因後果的動作
在此致上萬分謝意


獻花 x0 回到頂端 [4 樓] From:臺灣中華電信股份有限公司 | Posted:2011-06-05 09:23 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.086657 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言