2012-02-16 56 views
1

我們重寫某些應用程序在以前的Visual FoxPro開發和使用。NET原地重建(使用C#)的Visual FoxPro(VFP)CTOBIN和BINTOC功能 - 相當於淨

這裏是我們的情景: 我們的應用程序使用智能卡。我們從有名字和號碼的智能卡中讀取數據。這個名字可以用可讀的文本回來,但是在這種情況下,'900'的數字以2字節字符表示形式返回(131 & 132)並且看起來像這樣 - ƒ「

這2個特殊字符可以在擴展Ascii表..現在,你可以看到2個字節是131和132,可以有所不同,因爲沒有單個標準擴展ascii表(據我可以告訴讀這裏的一些帖子)

所以...智能卡先前被寫入使用VFP中的BINTOC功能,因此900被寫入卡中作爲「。並且在foxpro中,這兩個特殊字符可以使用CTOBIN函數轉換回整數格式。另一個內置函數在FoxPro中。

所以(終於到了點) - 到目前爲止,我們一直無法將這2個特殊字符返回到int(900),我們想知道在.NET中是否可以將整數的字符表示形式讀回實際整數。

或者有沒有辦法在C#中重寫這2個VFP函數的邏輯?

UPDATE: 一些擺弄後,我們認識到,讓900成爲我們需要900轉換成16位的二進制值2字節,那麼我們需要的是16位二進制值轉換成十進制值。

因此,如上所述,我們接收回131和132及其對應的二進制值爲10000011(十進制值131)和10000100(十進制值132)。 當我們串接這兩個值「1000001110000100」它給人的十進制值33668然而,如果我們去掉了領先1和改造「000001110000100」成十進制它給出了900的正確值...

不太知道爲什麼,這雖然...

任何幫助,將不勝感激。

+1

已解決問題。我們將數字900轉換爲二進制數字,將9 - 16(invlusive)的值作爲第二個字節,並將剩餘的數值和更新的值與前導1進行更新,因爲數字大於127。這可以在兩個方向上轉換> 127(並且小於32,7,不管上限值是多少) – Kev 2012-02-16 14:57:58

+0

例如:二進制中的900 = 1110000100.取最後8位數(10000100)並轉換爲十進制= 132。前兩位數字(11)並應用5個隨後的0,並以1開始二進制值,因此它看起來像這樣 - 10000011.將其轉換爲十進制數並且它是131.現在將131,132十進制值返回到單個二進制值轉換回十進制我們將它們分開轉換並加入它們給我們1000001110000100.現在,只需將位置1中的1替換爲0即可獲得原始的16位二進制值,如果我們在開始時只需要1正在使用2個位塊 – Kev 2012-02-16 15:00:49

+0

如果您認爲自己已經充分回答了您的問題,請隨時將其作爲您問題的答案發布。這將允許您將這個問題標記爲已回答。 – 2012-02-17 14:39:09

回答

0

它看起來像VFP存儲您的價值作爲一個有符號的16位(短)整數。對於負數來說,它似乎有一個奇怪的轉換點,但它增加了128到8位數,並將32768增加到了16位數。

因此,從字符串中轉換16位數字應該像讀取16位整數一樣簡單,然後從中取32768。如果您必須手動執行此操作,則第一個數字必須乘以256,然後添加第二個數字以獲取存儲的值。然後從這個數字拿32768來獲得你的價值。

例子:

131 * 256 = 33536 
33536 + 132 = 33668 
33668 - 32768 = 900 

你可以嘗試使用C#轉換爲每http://msdn.microsoft.com/en-us/library/ms131059.aspxhttp://msdn.microsoft.com/en-us/library/tw38dw27.aspx至少做一些工作你,但如果沒有它不應該太難手工編碼以上。