2010-10-27 57 views
1

我想讀取二進制文件到C#結構。該文件是從C創建的,下面的代碼創建了50個以上的字節行中的2個字節。該文件C無符號短褲中存儲的值如何?

unsigned short nDayTimeBitStuffed = atoi(LPCTSTR(strInput)); 
unsigned short nDayOfYear   = (0x01FF & nDayTimeBitStuffed); 
unsigned short nTimeOfDay   = (0x01F & (nDayTimeBitStuffed >> 9)); 

二進制值0000000100000100

期望的值是1和2,所以我認爲有點排序/交換正在進行但不確定。

任何幫助將不勝感激。

謝謝!

回答

2

答案是'它取決於' - 最值得注意的是在機器上,以及數據如何寫入文件。試想一下:

unsigned short x = 0x0102; 
write(fd, &x, sizeof(x)); 

在某些機器(英特爾),低位字節(0×02)將高位字節(0×01)之前寫的;在其他人(PPC,SPARC)上,高位字節將在低位字節之前寫入。

所以,從一個小端(英特爾)的機器,你會看到字節:

0x02 0x01 

但是從大端(PPC)的機器,你會看到字節:

0x01 0x02 

您的字節看起來是0x01和0x04。你的計算0x02似乎有缺陷。

您顯示的C代碼不寫任何內容。 nDayOfYear中的值是輸入值的低9位; nTimeOfDay看起來是接下來的5位(所以使用了16位中的14位)。例如,如果strInput中的值是十進制12141,0x2F6D,那麼nDayOfYear中的值將是365(0x16D),而nTimeOfDay中的值將是23(0x17)。

這是一個有趣的存儲順序;你不能簡單地比較這兩個值,而如果你將一年中最重要的部分和時間打包成不太重要的部分,那麼你可以將值作爲簡單整數進行比較,並獲得正確的比較結果。

+0

我正在讀取它作爲2 - 1字節的字段,但它應該被讀爲1 - 2字節字段與其中的2個值。所以,00000100會失去1位到nDayOfYear使nTimeOfDay = 2。太棒了,謝謝! – MikeJr 2010-10-27 04:29:08

0

預期的文件內容與用於創建文件的處理器和編譯器非常相關,如果它是二進制的。

我假設一個Windows機器在這裏,它使用2個字節的短,並把它們放在小端的順序。

你的意見也沒有多大意義。如果它是兩個字節,那麼它應該使用兩個字符,而不是短路。第一個的範圍將是1-365,所以它肯定需要多於一個字節來表示。我假設你想要前4個字節,而不是前2個。

這意味着第一個字節將是DayOfYear的第0-7位,第二個字節將是DayOfYear的第8-15位,第三個字節將是TimeOfDay的第0-7位,第四個字節將是TimeOfDay的第8-15位。