如何讀取資料庫欄位內的 ACSII碼資料
大家好..
初次發問,希望大家能幫忙一下,問題如下..
現在有兩個 DBF 的資料庫,目前以 A 資料庫及 B 資料庫稱之...
A 資料庫是主檔,B 資料庫是附檔...
在 A 資料庫有一個欄位的內容是記錄 B 資料庫的記錄位置..
兩個檔案是以此欄位做關連的...
該欄位的資料型態為字元型態,欄位大小為三位數。
現在問題是 A 資料庫內的那個欄位以「 256 進位」的方式記錄 B 檔案的記錄位置,
然而在 DOS 的時候,Clipper 可以正確無誤的讀出該欄位的資料,
可是我用 VB 開啟該 DBF 檔的時候,無法正確的讀出該欄位的資料。
因為是以 256 進位的方式記錄,相信大家都沒學過 256 進位吧 @_@
像二進位 是用 0,1
像16進位 是用 0~9 A~F 記錄
而 256 進位則是用 ASCII碼的 ASCII(1)~ASCII(256) 去記錄..
而 VB 似乎無法正確讀取資料庫內全部的 ASCII 碼.
請問這該如何解決 ... 煩請各位高手幫忙想一下...
大家好..
初次發問,希望大家能幫忙一下,問題如下..
現在有兩個 DBF 的資料庫,目前以 A 資料庫及 B 資料庫稱之...
A 資料庫是主檔,B 資料庫是附檔...
在 A 資料庫有一個欄位的內容是記錄 B 資料庫的記錄位置..
兩個檔案是以此欄位做關連的...
該欄位的資料型態為字元型態,欄位大小為三位數。
現在問題是 A 資料庫內的那個欄位以「 256 進位」的方式記錄 B 檔案的記錄位置,
然而在 DOS 的時候,Clipper 可以正確無誤的讀出該欄位的資料,
可是我用 VB 開啟該 DBF 檔的時候,無法正確的讀出該欄位的資料。
因為是以 256 進位的方式記錄,相信大家都沒學過 256 進位吧 @_@
像二進位 是用 0,1
像16進位 是用 0~9 A~F 記錄
而 256 進位則是用 ASCII碼的 ASCII(1)~ASCII(256) 去記錄..
而 VB 似乎無法正確讀取資料庫內全部的 ASCII 碼.
請問這該如何解決 ... 煩請各位高手幫忙想一下...
文章標籤
全站熱搜

應該是 integer * 1 ,或是 char * 1,也就是 Byte
256進位....?@@? 那還是16進位啦~~~-_-!!! 只是看他在檔案中是往前一個byte進位還是往後而己.
補充說明何謂 256 進位.. 像一般 16 進位的 1A 來說... 換算成十進位就是 A*16^0 + 1 * 16^1 =10 + 16 =26 以 256 進位來說.. 1A 換成十進位就是 ASC("A")*256^0 + ASC("1")*256^1 =65*256^0 + 49*256^1 =65+12544 =12609 該 欄位就是以此換算出 B 檔案的記錄位置的... 由於 ASCII 碼有許多碼並無法順利顯示, 以致於讀取時也無法讀取到一些看不見的 ASCII碼.. 所以不知如何解決 .... 若無法解決此事,我只好重新回到 DOS + Clipper 的懷抱了 @_@
...那它47如何表示?....-_-!!!
如果是1個byte根本無法表示! 因為範圍是 &h00~&hFF,你只能拆出 0-F,0-F ,再asc()的結果,沒有=<47這些數! 你所舉例的"1A"已經佔兩個bytes了!!也就是 &h3141=12609 (自己算一下是不是?!) 而你所謂的256進位,其實就是(16)^2...那還是叫16進位,幫幫忙~~~
Q:那它47如何表示?....-_-!!! A:如果你的 47 是十進位的話,那資料庫內的記錄就是( / ) 因為 / 這個符號的 ASCII 碼就是 47 該欄位大小是三個字元,所以他能表示的記錄大小為 1~16,843,008 您一直拘泥在 16 進位這個問題點,但我可以很肯定的告訴你, 問題不在那裡.... 其實真正的問題點在於資料庫內該筆記錄內 含有 ASCII字元該如何正確無誤讀出來... 請注意!! 是含有全部的 ASCII 字元!! 指的是 ASCII 碼的1 到 ASCII 碼的 255 唷!! 像該欄位內有一筆記錄,記錄著兩個字元, 分別是兩個符號 第一個符號為 / 第二個符號為 一個看不見的字元,但實際上第二個符號為 CHR(127) <-- 舉例. 但當我讀取該欄位時我只能讀到一個字元而已(因為第一個字元是看的見的), 但實際上該欄位卻有兩字元, 我無法真正的讀到全部的兩個字元...
拘泥的是你那有誤的觀念,以byte讀取就是答案了! 還是要告訴你:那叫16進位.
另外:如果你仍堅持在VB中要以"字串"來算"你的256進位"是不可能的!
實際的算法: dim byte1 as byte,byte2 as byte byte1=讀取第一個byte byte2=讀取第二個byte 位置=val("&h" & iif(len(hex(byte1))=1,"0" & hex(byte1),hex(byte1)) & iif(len(hex(byte2))=1,"0" & hex(byte2),hex(byte2)))
阿戊: 佩服您,我不喜歡對牛彈琴,事先也許不知道,但是知道後,我就不想廢話了,您的耐心令我佩服。在計概等級的基礎也要往相反方向爭辯,這種對話我實在打不下去,系統定義的資料型態,是計概等級的討論。 我再懷疑,這類問題可能要從 bit 談起,討論到 4 bit = 16 , 1 Byte = 8 bits = 256 後,再繼續談 Integer = 2 Bytes 的組合,接著討論 Char * 1 所代表的意義,如何在傳統資料庫進行變化應用成為 Char * n,再擴展為 Long 、 Long Long 及十進位,最後再擴展到 Oracle 所支援的任意 Bytes 數。
to 散呷郎: 下面的程式或許對你的VB字元運算的觀念有所助益, Dim s As String, t As String Dim b() As Byte s = Chr(49) + Chr(65) '=1A Print s b = s Print b(0), b(2) '轉成byte時,一個字元等於兩個bytes,英數字元取低位元即可 t = "&h" & Format(Hex(b(0)), "00") & Format(Hex(b(2)), "00") Print t, Val(t)
t = "&h" & Format(Hex(b(0)), "00") & Format(Hex(b(2)), "00") 改為 t = "&h" & Hex(b(0)) & Right("0" & Hex(b(2)), 2) 才正確
對於進階的軟體使用者,實在也沒辦法要求太高. 建議原發問者在DOS下先用Clipper匯出到另一個"直接以數字存儲"的資料庫(或欄位),就可直接避開asc>127的問題了!
256進位.....很有意思, 我個人覺得這個比較像是自行設計出來的一種資料對應方式, 他以三個Byte來作對應用的 KEY 值, 那它可對應的範圍是(0,0,0)~(255,255,255), 但是因為 ASCII 碼中有些是不可見字元, 所以把資料庫中的欄位直接讀出後, 以一般的字串方式來處理將無法得到正確的值, 所以必須把讀出來的值以Binary的方式處理, 才能取得其對應的十進制ASCII值, 後再以『256進位』的方式換算出對應的十進制的值, 再去跟附資料庫的欄位做比對。 試試以下的做法 Dim BinaryStr As String BinaryStr = ChrB(226) & ChrB(206) & ChrB(48) Debug.Print AscB(LeftB(BinaryStr, 1)) Debug.Print AscB(MidB(BinaryStr, 2, 1)) Debug.Print AscB(RightB(BinaryStr, 1)) 希望有所幫助。
分解來做運算自已然很容易,但在win中使用資料庫引擎來讀取,就會發現問題所在了!
SQLstmt = "Select EnCodeField From TestTABLE" adoRS.Open SQLstmt, conn, adOpenStatic, adLockReadOnly For I = 1 To LenB(adoRS!EnCodeField) Debug.Print AscB(MidB(adoRS!US_PASS, I, 1)) Next I 我只有測試過 SQL 可以讀得出來,Access 我沒試過, 但如果要用一句SQL語法來換算的話.... Select (Ascii(Substring(EnCodeField,1,1)) * 255 * 255) + (Ascii(Substring(EnCodeField,2,1)) * 255) + Ascii(Substring(EnCodeField,3,1)) As DeCodeField From TestTABLE SQL語法的工程似乎浩大了一點 @@b