各位大神你們好。。。。請幫小弟下吧。
首先,公司領導有個要求,讓我把這個檔案讀出來。我大概看了看,應該是個外部程式的日志。然后讓我找出需要的資料部分的特點,進行搜索,然后讀出那部分(那行),進行文字拆解分析得出需要的結果。
然后我打開看傻了眼,內容是這樣的。如下圖

然后
我用NOTEPAD++打開后,內容是這樣的(如下圖)
(編碼設定的big5)

我想,應該是檔案有自己的格式,感覺領導的意思是讓我把這個外部程式解讀了。
和領導稍微了解了下,那個notepad++讀出來應該是正確的。NUL\EOT\ESC那些應該沒什么用(應該是ASCII字符?),把他們處理好,格式弄正確了,我再進行決議應該就可以了。于是我試了試
Dim sA As String
Open "c:\1.txt" For Binary As #1
sA = Space(LOF(1)) '注釋:用空格填充sA變數
Get #1, , sA '注釋:用Get陳述句獲取檔案全部內容
RichTextBox1.Text = sA 'text1.txt好像有32K限制,所以用了richtextbox
Close #1
可以讀出來亂七八糟的,我不知道如何把那些null eof如何清理掉,因為我讀出來根本就是些ASCII符+gbk字符。如果清理不掉ASCII,,,,沒法繼續去決議(轉成BIG5)這些了。
求大神指點應該怎么做才能清理掉那些ASCII字符,希望能給出具體陳述句。萬分感謝。100分滿分送上
原檔案在這里
https://pan.baidu.com/s/1i5N28rN
uj5u.com熱心網友回復:
這個檔案應該是某種資料庫檔案,你直接決議的話難度極大。你了解一下產生這個檔案的軟體,用了什么樣的資料庫。
uj5u.com熱心網友回復:
主要是沒有太好的其他辦法,現在只是想把ASCII那些沒用的東西過濾掉。。。
uj5u.com熱心網友回復:
問題遠沒有過濾掉字符就可以解決這么簡單,他是有格式存盤的。你要了解這個資料庫是什么,現在唯一線索是檔案開頭的四個字符 DBSF,不知道是哪種資料庫的打頭字符。
uj5u.com熱心網友回復:
root@XinZPC:/mnt/d# file 1organize.dat
1organize.dat: FoxPro FPT, blocks size 0, next free block index 1145197382
FoxPro不熟,看樣子還需要一個 dbf檔案才能完整湊出一個資料庫來。電腦上先裝個打開試試吧。
uj5u.com熱心網友回復:
因為據我所知,這個檔案基本上是不會膨脹的,大小不會無限增大,而且資料較少(最多總計30條固定格式內容變換的樣子),所以大大您有沒過濾掉那些ASCII的方案指點一二嗎,大概關鍵字我去百度也行。。。。其實只要NOTEPAD++那種讀出來就行了,我replace掉nul也好啊。。。。
uj5u.com熱心網友回復:
FOXPRO(只聽說過)?我去看看,謝謝大佬
uj5u.com熱心網友回復:
完全搞不明白。。。話說能不能簡單點把那NUL給清了。。。。
uj5u.com熱心網友回復:
轉換編碼后,只替換掉了 “空字符”(你在Notepad++中看到的 NUL ),然后就是這個效果:當然這其中還有不少其它的“非標準字符”。也許可以作為“下一步處理的分隔符”呢。

uj5u.com熱心網友回復:
非常感謝,我趕緊去試試
uj5u.com熱心網友回復:
如果你覺得它是“固定的”,那么你要提取的地方,位置、長度也應該是有一定的規律,并且也是固定的吧?
那你不如多比較幾個檔案,看它的記錄長度、記錄位置有沒有固定引數?
說不定,你只要按“從某一位置起,以固定長度讀取每一條’記錄‘的資料,再轉換編碼”,
就可以比較容易的提取出你想要的東西呢。
uj5u.com熱心網友回復:
. . . . . . . .
非常感謝,我趕緊去試試
Private Declare Function MultiByteToWideChar Lib "Kernel32" ( _
ByVal CodePage As Long, ByVal dwFlags As Long, _
ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, _
ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public Function MultiByteToUTF16(bufData() As Byte, CodePage As Long) As String
Dim BuffSize As Long, DataSize As Long
DataSize = UBound(bufData) + 1&
BuffSize = MultiByteToWideChar(CodePage, 0&, bufData(0&), DataSize, 0&, 0&)
MultiByteToUTF16 = Space$(BuffSize)
Call MultiByteToWideChar(CodePage, 0&, bufData(0&), DataSize, StrPtr(MultiByteToUTF16), BuffSize)
End Function
CP_BIG5的值是 950 。
uj5u.com熱心網友回復:
問題遠沒有過濾掉字符就可以解決這么簡單,他是有格式存盤的。
你要了解這個資料庫是什么,現在唯一線索是檔案開頭的四個字符 DBSF,不知道是哪種資料庫的打頭字符。
因為據我所知,這個檔案基本上是不會膨脹的,大小不會無限增大,而且資料較少(最多總計30條固定格式內容變換的樣子),所以大大您有沒過濾掉那些ASCII的方案指點一二嗎,大概關鍵字我去百度也行。。。。其實只要NOTEPAD++那種讀出來就行了,我replace掉nul也好啊。。。。
如果你覺得它是“固定的”,那么你要提取的地方,位置、長度也應該是有一定的規律,并且也是固定的吧?
那你不如多比較幾個檔案,看它的記錄長度、記錄位置有沒有固定引數?
說不定,你只要按“從某一位置起,以固定長度讀取每一條’記錄‘的資料,再轉換編碼”,
就可以比較容易的提取出你想要的東西呢。
對的,大佬,就是這個思路。不過,您的代碼說MultiByteToUTF16沒有定義函式。。。
uj5u.com熱心網友回復:
函式看見了。不過,CP_BIG5的值是 950 。是啥。。。?
沒懂,這個如何去定義
程式報型別不符CP_BIG5
uj5u.com熱心網友回復:
你定義那個常量沒有?
我在8樓的代碼,呼叫 MultiByteToUTF16( )那兒,CP_BIG5 你直接換成 950就行了。
uj5u.com熱心網友回復:
你定義那個常量沒有?
我在8樓的代碼,呼叫 MultiByteToUTF16( )那兒,CP_BIG5 你直接換成 950就行了。
謝謝大佬。我去試試
uj5u.com熱心網友回復:
電腦記憶體或檔案內容或傳輸內容只是一個一維二進制位元組陣列及其對應的二進制地址;人腦才將電腦記憶體或檔案內容或傳輸內容中的這個一維二進制位元組陣列及其對應的二進制地址的某些部分看成是整數、有符號數/無符號數、浮點數、復數、英文字母、阿拉伯數字、中文/韓文/法文……字符/字串、匯編指令、函式、函式引數、堆、堆疊、陣列、指標、陣列指標、指標陣列、陣列的陣列、指標的指標、二維陣列、字符點陣、字符筆畫的坐標、黑白二值圖片、灰度圖片、彩色圖片、錄音、視頻、指紋資訊、身份證資訊……
對電腦而言沒有亂碼,只有二進制位元組;對人腦才有亂碼。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
uj5u.com熱心網友回復:
DBSF開頭的檔案應該是符合某種標準的資料庫檔案。我猜。
uj5u.com熱心網友回復:
DBSF開頭的檔案應該是符合某種標準的資料庫檔案。我猜。
這個嘛……應該是有“某種標準”的。
只是,你能找到這是哪種型別的資料庫嗎?你能找到讀寫這種資料庫的介面庫(dll)嗎?
如果找不到“公開介面”,你能自己寫代碼決議這種資料庫嗎?
uj5u.com熱心網友回復:
回帖前不看帖嗎?還是強行裝成不看帖?早就說了這是FoxPro啊
uj5u.com熱心網友回復:
回帖前不看帖嗎?還是強行裝成不看帖?早就說了這是FoxPro啊
這就叫選擇性無視。
uj5u.com熱心網友回復:
ACT FoxPro Foxdoc Action DiagramACT Documenting wizard action diagram (Microsoft Visual FoxPro)
APP Generated application or active document (Microsoft Visual FoxPro)
APP FoxPro Generated Application
CDX Microsoft's Visual Foxpro index
DBC Microsoft's Visual FoxPro database Container file
y Act!, Clipper,FoxPro, Arago, Wordtech, xBase, and similar database o
DBX Microsoft's Visual FoxPro Table file
DCT Microsoft's Visual FoxPro database container file
DCX Microsoft's Visual FoxPro database container file
ERR Compilation error file (Microsoft Visual FoxPro)
ESL Distributable support library file (Microsoft Visual FoxPro)
FKY Macro (Microsoft FoxPro)
FLL Distributable dynamic link library (DLL) (Microsoft Visual FoxPro)
FMT Csreen format file (Microsoft Visual FoxPro)
FP Configuration file (FoxPro)
FPC Catalog file (FoxPro)
FPT Memo fields (Microsoft FoxPro)
FRT Report menu (FoxPro)
FRX Report (Microsoft FoxPro)
FXP Compiled source code (FoxPro)
uj5u.com熱心網友回復:
IDX Microsoft FoxPro relational database index fileLBT Microsoft FoxPro labels
LBX Microsoft FoxPro labels
MNT Microsoft FoxPro menus
MNX Microsoft FoxPro menus
MPR Microsoft FoxPro menus (compiled)
PJX Microsoft's Visual Foxpro Project
PJT Microsoft's Visual Foxpro Project
PRG dBase, Clipper, and FoxPro program source files
SCT Microsoft FoxPro forms
SCX Microsoft FoxPro forms
VCT Microsoft FoxPro class library
VCX Microsoft FoxPro class library
uj5u.com熱心網友回復:
回帖前不看帖嗎?還是強行裝成不看帖?早就說了這是FoxPro啊
你在4樓的回復,那天下午就看了的。
只是沒怎么明白,也無法與這個“檔案內容”關聯起來…………
我也是一直沒有關注FoxPro的,這方面的東西不清楚。
FoxPro的“資料庫”檔案,不應該是用dat做擴展名的吧?
記得安裝VB6企業版的時候,它的“資料庫支持”中好象有FoxPro的支持(我安裝時取消了的),
難道說,可以安裝相應的組件,直接按“資料庫”方式打開,然后讀取這個檔案的資訊?

uj5u.com熱心網友回復:
回帖前不看帖嗎?還是強行裝成不看帖?早就說了這是FoxPro啊
你在4樓的回復,那天下午就看了的。
只是沒怎么明白,也無法與這個“檔案內容”關聯起來…………
我也是一直沒有關注FoxPro的,這方面的東西不清楚。
FoxPro的“資料庫”檔案,不應該是用dat做擴展名的吧?
記得安裝VB6企業版的時候,它的“資料庫支持”中好象有FoxPro的支持(我安裝時取消了的),
難道說,可以安裝相應的組件,直接按“資料庫”方式打開,然后讀取這個檔案的資訊?
這個是FoxPro的備注檔案,網上查了一下,這個檔案主要用來存放特定欄位(備注型M,通用型G)的內容,相當于是主資料庫的附加,題主缺的是主資料庫檔案dbf,如果有這個,直接還原資料庫就可以拿到完整資料結構和資料內容。
檔案擴展名只有在windows系統里直接運行或者與特定程式進行較強關聯的時候才需要用到(dll),系統通過不同擴展名識別其對應的打開程式。如果只是普通的資料檔案,沒這么多講究,這個在access的網站上見得比較多,出于安全考慮,經常會將xxx.mdb改成類似 xx#12.asp的檔案名。
回到這個檔案,從二進制形式進行反決議是可以讀取這些欄位的值,但是再回想一下,意義有多大(相當于從資料庫里直接讀出幾列孤立資料,比如{張三,15,82,46273842,FSDA,早}),或者有沒有別的更合理的做法(讓領導想辦法搞到另一個檔案)。檔案決議的時候,如何把二進制內容決議成原始資料確實重要,但是資料結構與資料含意同樣重要。題主只有兩條路:繼續悶頭決議這個檔案,把所有資料讀出來,但是這種方法一定需要實際的驗證環境去輔助猜測資料的真實含義(這些輔助的資訊不光可以用來幫助決議檔案,也可以用來驗證自己的決議結果),讓資料變得不孤立,而且驗證條件越充足越好,需要找領導要更多的資訊(比如,知道檔案是游戲存檔,那我在決議出資料的時候可以把資料往游戲里的數值上去靠,去驗證);第二條路,直接找到dbf資料庫檔案,完工。
再跑個題,如果不為解決這個問題,這個樓里對這個檔案進行決議程序的回帖對新手幫助非常大,是個很好的學習案例。
uj5u.com熱心網友回復:
剛才用工具軟體看了一下檔案資料。然后弄了段提取代碼:
Private Sub Command1_Click()
Dim arrBuff(23&) As Byte
Dim arrData() As Byte
Dim strTemp As String
Dim i&, j&, k As Long
Dim w&, u&, m As Long
Open "E:\Temp\1organize.dat" For Binary As #1
m = LOF(1)
ReDim arrData(m - 1&)
Get #1, 1&, arrData
Close
j = 0&: i = 0&
w = m - 64&
Do
If (i > w) Then Exit Do
u = 0&
For k = i To 7& + i
If (0 = arrData(k)) Then Exit For
u = 1& + u
Next
If (5& <= u) Then
If (0& = arrData(k)) Then
k = 1& + k
If (160& < arrData(k)) Then
Call CopyMemory(arrBuff(0&), arrData(k), 24&)
strTemp = MultiByteToUTF16(arrBuff, CP_BIG5)
u = InStr(1&, strTemp, vbNullChar)
j = 1& + j
Debug.Print j, Left$(strTemp, u - 1&)
i = 24& + i
Else
i = k
End If
Else
i = 1& + i
End If
Else
i = 1& + i
End If
Loop
End Sub
輸出資料:
1 打架沒力
2 反轉世界
3 反轉世界
4 打架沒力
5 打架沒力
6 打架沒力
7 打架沒力
8 打架沒力
9 巨神狻猊禁衛
10 帶兵跑路
11 打架沒力
12 打架沒力
13 打架沒力
14 打架沒力
15 打架沒力
16 打架沒力
17 打架沒力
18 打架沒力
19 打架沒力
20 打架沒力
21 打架沒力
22 打架沒力
23 打架沒力
24 打架沒力
25 打架沒力
26 打架沒力
27 落花時節又逢君
28 落花時節又逢君
29 我
30 猛將
31 你
32 他
33 軍師
34 我
35 軍師
36 猛將
37 猛將
38 攤貨
39 你
40 顫抖的奶
41 顫抖的奶
42 顫抖的奶
43 顫抖的奶
44 方1
45 方1
46 方1
47 軍2
48 闊少
49 趙子龍
50 顫抖的奶
51 趙子龍
52 趙子龍
53 戰謀
54 戰軍
55 戰謀
56 孤戰
57 孤戰
58 孤戰
59 戰軍
60 孤戰
61 孤戰
62 孤戰
63 戰軍
64 戰軍
65 孤戰
66 孤戰
67 孤戰
68 小軍
69 小軍
70 闊少
71 小小小
72 闊少
73 小小小
74 小豪
75 小豪
76 闊少
77 小豪
78 小小小
79 小豪
80 小軍
81 小小小
82 小豪
83 闊少
84 小軍
85 小豪
86 小豪
87 闊少
88 小軍
89 闊少
90 小豪
91 闊少
92 小豪
93 闊少
94 小豪
95 弩車
96 投石車
97 投石車
98 【黃龍士】
99 【黃龍士】
100 【黃龍士】
101 【黃龍士】
102 【黃龍士】
103 【黃龍士】
104 【黃龍士】
105 【黃龍士】
106 【黃龍士】
107 【黃龍士】
uj5u.com熱心網友回復:
反正檔案數亂七八糟的,這樣處理后可能也沒有提取完。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
檔案是公開的資料格式,相對就簡單多了如果是不公開的資料格式,就需要多個類似檔案,反復對比,測驗,決議才能清楚資料結構
需要注意的是,你使用的工具不對,決議這種檔案的關鍵工具 winhex 之類的16進制資料查看器
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/54288.html
標籤:VB基礎類
