2013-09-27 17 views
0

我不明白我從下面的代碼被黑客竊取的結果,有人可以解釋。只有在讀取UNICODE編碼文本文件時纔會發生。FileStream Seek/ReadByte似乎扭轉了文件的字節順序

fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

// read from start 
byte[] lne = new byte[100]; 
int actual = fs.Read(lne, 0, lne.Length); 
string line = Encoding.Unicode.GetString(lne, 0, actual); // ok readable stuff as expected 
string line1 = Encoding.BigEndianUnicode.GetString(lne, 0, actual); // fail as expected 

// move down into the file 
fs.Seek(-150, SeekOrigin.End); 
fs.ReadByte(); // take this out, works ok! 

lne = new byte[100]; 
actual = fs.Read(lne, 0, lne.Length); 
line = encoding.GetString(lne, 0, actual); // fail non readable stuff - NOT EXPECTED 
line1 = Encoding.BigEndianUnicode.GetString(lne, 0, actual); // SUCCESS, readable - huh! 

很明顯,代碼不是「真實世界」,它只是我真正的代碼正在做什麼的細分。

在第一個Encoding.Unicode.GetString之後,我可以在變量'line'中看到好的可讀數據,並且'line1'中的數據如預期的那樣糟糕。

第二個Encoding.Unicode.GetString後我看到完整的廢話(japenese /中文我不知道),但line1現在包含來自該文件的可讀數據。

如果我拿出ReadByte,一切都按預期工作。

任何任何想法,爲什麼發生這種情況。

TIA。

+1

考慮使用[StreamReader](http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx) –

回答

0

Unicode字符串是2個字節,併爲ASCII字符串看起來像

0x41, 0, 0x42, 0, 0x43, 0 ... // {ASCII code for A}, 0,... 

所以,如果你在閱讀相反的順序(BigEndianUnicode),你會得到無意義的字符字節。串上述解讀爲0x4100, 0x4200, 0x4300 ...,而不是0x0041,...

類似的,當你開始在奇偏移(您尋求的文件代碼結束)閱讀發生了 - 與ASCII文本的字節是這樣的:

0, 0x41, 0, 0x42, 0, 0x43 ... 

被解讀爲0x4100, 0x4200, 0x4300...

ReadByte取出第一個0,因此從性格開始閱讀,而不是它和序列中間成爲有效的ASCII-僅Unicode字符串(與可能無效的最後一個字符:

0x41, 0, 0x42, 0, 0x43,... 
+0

是的,我認爲這是問題,也沒有真正的解決方法,我只是發現奇怪的是,第二個BigEndianUnicode.getstring產生有效的可讀數據。但是後來想到它,我猜如果我已經讀入一個無碼字符串的「中間」,接下來的2個字節就會反轉。 –

+0

@ push22注意到第二個'BigEndianUnicode.GetString'會顯示亂七八糟的非ASCII字符,因爲它將開始從2個字符中選取一半:從第二個字節開始的0x41,0x01,0x42,0x2將以'0x0142'結束,而不是無論是「0x0141」還是「0x0242」。 –

2

您正在移動到流的末尾減去100個字節。然後您讀取一個字節(將您帶到流的末尾減去99個字節),然後您嘗試讀取100個字節。這需要你在流之外的一個字節。

+0

ta,但這並不能解釋爲什麼在第一行和第二行的好數據 - 在第二次閱讀時,我編輯了代碼以消除100/99的差異。 –