Board logo

標題: [發問] 想請問Excel的 chr 函數的問題 [打印本頁]

作者: luhpro    時間: 2010-12-14 23:17     標題: 想請問Excel的 chr 函數的問題

本帖最後由 luhpro 於 2010-12-14 23:21 編輯

Sub main()
  Dim sChar$

  Open "C:\test.bin" For Binary As #1
    sChar = Right(Chr(18), 1)
    Put #1, 1, sChar
    sChar = Right(Chr(54), 1)
    Put #1, 2, sChar
    sChar = Right(Chr(238), 1)
    Put #1, 3, sChar
  Close #1
End Sub

如上述程式,
想寫入多個指定字元到 二進位 檔案內.

試過 當ascii碼數不大時寫入的字元都正確,
但那個 shr(238) 會變成將 chr(0) 寫入檔案,
即時視窗打上 ?asc(chr(238)) 結果也是 0

但 Excel 中關於 chr 的說明上有註明 :
    charcode 引數是一個用來識別某字元的 Long。
數字型態為 Long 不知為何 238 卻轉不出正確的字元呢?
作者: Min    時間: 2010-12-15 22:59

特殊字元 顯示不出來...
就直接問 ?chr(238) 就顯示不出來了....
我之前有也遇過 是有些電腦可以Print出來 有些不行!
我最後是改其它符號解決~
作者: luhpro    時間: 2010-12-15 23:59

本帖最後由 luhpro 於 2010-12-16 00:14 編輯

回復 2# Min

我主要的用途是要寫到 二進位檔 內,
而不是想顯示出來文字,
我試過在同一台電腦中用 C 語言 用 chr() 函數寫入該字元到 二進位檔 是沒問題的.

主要是在公司 Excel 軟體直接可以使用,
但 C 礙於版權問題在公司不能安裝及使用.

此前也已經實現成功其反向作業 : 從二進位檔中還原出本來的數值 :

Sub Main()

  Dim iColumn%, iRow%
  Dim bData As Byte
  Dim lPosition As Long

  Close
  With Sheets("Sheet1")
    lPosition = 1
    Open "C:\test.bin" For Random As #1 Len = 1
      iColumn = 1
      iRow = 1
      
      While Not EOF(1)
        Get #1, lPosition, bData

        .Cells(iRow, iColumn) = bData
        iColumn = iColumn + 1
        
        If iColumn > 256 Then
          iColumn = 1
          iRow = iRow + 1
        End If
        lPosition = lPosition + 1
      Wend
   
    Close #1
  End With
  
End Sub

我猜測在 MS 的 Basic 上實作應該也不會有問題,
是否是我之前所用的方式錯誤,
亦或有可能是 Excel VBA 本身就實現不出來呢?
----------------------------------------------------------------
補充 :
剛剛又試著用 Random 檔的方式實做成功 :
Sub Main()

  Dim iI%
  Dim bChar As Byte
  Dim lPosition As Long

  Close
    lPosition = 1
    Open "C:\test1.bin" For Random As #1 Len = 1
      
      For iI = 255 To 0 Step -1
        bChar = iI
        Put #1, lPosition, bChar
        lPosition = lPosition + 1
      Next iI
   
    Close #1
  
End Sub

但不知 Binary 檔 (循序寫入, 不用管下個資料要寫到檔案中的第幾個位置) 的開啟方式又要如何實作呢?
作者: Min    時間: 2010-12-16 00:14

是轉二進位還是轉Ascii?
作者: luhpro    時間: 2010-12-16 00:18

回復 4# Min

?
二進位檔不就是寫入字元的 Ascii碼 嗎?
Ascii 範圍 0 ~ 255
作者: Min    時間: 2010-12-16 06:47

不一樣喔~
二進位 就只有0與1...
http://zh.wikipedia.org/zh/Uuencode
作者: luhpro    時間: 2010-12-19 19:15

本帖最後由 luhpro 於 2010-12-19 19:19 編輯

回復 6# Min
這跟我的理解不同呢.

你所給連結中提到的 uuencode 是在郵件系統傳輸的一個 "編碼" 程式,是一種 "二進位" 到 "文字" 的編碼,
所以它並非是一種 "二進制檔案".

若我們從底下這個連結中看 :
文字文件 : http://zh.wikipedia.org/zh-tw/%E6%96%87%E5%AD%97%E6%AA%94  (插入鏈接功能不能用?)
裡面有一段話倒是可以根本闡明所謂的二進制檔案是怎麼回事 :

一般來說,電腦可以分為兩類: 文字文件 和 二進制檔案 。

也就是說只要不是 "文字文件" 的就是 "二進制檔案". (包括 .EXE程式檔 甚至是 .MP4 音訊壓縮檔都是, 差別只在於其用途不同而有其特定的 "識別" 格式存在)

而文字檔案之所以是文字檔案,
在於其定義中有闡明 :
文字文件可以包含 "純文字",透過在文字文件最後一行後放置檔案結束標誌來指明檔案的結束。
在其中除了  換行 LF (0x0D) 與 返首 CR(0x0A) 字元以外,
全部都是 "可視字元".
而 "二進制檔案" 中並非只有可視字元.

回到原主題 :
在 Excel 中若想以 Open binary 指令來建立 "二進制" 檔案,(當純只是想存放 Ascii 碼為 0 ~ 255 的字元資料,而暫不論其格式)
正確的使用方式為何?

另 chr() 函數是否真的只能產生 ascii 碼為 128 以下的字元呢?
若真是如此, 那其說明中所謂的 :
"charcode 的正常範圍為 0-255" 及 "charcode 引數是一個用來識別某字元的 Long"
又有何意義呢?
直接告訴我們其範圍為 0 - 127 與 其格式為 Byte 不就足夠了嗎?




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)