2012-12-01 168 views
0

您好我正在開發的C#的客戶端應用程序和服務器是用C++INT []字符串C#

服務器使用:

inline void StrToInts(int *pInts, int Num, const char *pStr) 
{ 
    int Index = 0; 
    while(Num) 
    { 
    char aBuf[4] = {0,0,0,0}; 
    for(int c = 0; c < 4 && pStr[Index]; c++, Index++) 
     aBuf[c] = pStr[Index]; 
    *pInts = ((aBuf[0]+128)<<24)|((aBuf[1]+128)<<16)|((aBuf[2]+128)<<8)|(aBuf[3]+128); 
    pInts++; 
    Num--; 
    } 

    // null terminate 
    pInts[-1] &= 0xffffff00; 
} 

一個字符串轉換爲int []

在我的C#客戶端我收到:

int[4] { -14240, -12938, -16988, -8832 } 

如何將數組轉換回一個字符串? 我不想使用不安全的代碼(例如指針) 我的任何嘗試都會導致無法讀取的字符串。

編輯: 這裏是我的計算策略之一:

private string IntsToString(int[] ints) 
{ 
    StringBuilder s = new StringBuilder(); 
    for (int i = 0; i < ints.Length; i++) 
    { 
    byte[] bytes = BitConverter.GetBytes(ints[i]); 
    for (int j = 0; j < bytes.Length; j++) 
     s.Append((char)(bytes[j] & 0x7F)); 
    } 
    return s.ToString(); 
} 

我知道我需要照顧字節序的,但作爲服務器是我的本地計算機和服務器上也運行,我認爲這是不是問題。
我的另一個嘗試是使用一個結構顯式佈局和相同的FieldOffset整數和字符,但它也不起作用。

+2

結果字符串的外觀應該如何? –

+1

到目前爲止您嘗試過什麼?請分享你的代碼,我期待已經做了所有位移的事情 – sll

+0

你想返回一個字符串數組還是單個字符串(csv) –

回答

1

也許你可以試試(使用LINQ):

int[] fromServer = { -14240, -12938, -16988, -8832, }; 

string reconstructedStr = new string(fromServer.SelectMany(BitConverter.GetBytes).Select(b => (char)(b - 128)).ToArray()); 

未經檢驗的,但有一些東西要開始。不知道減法128是否正確。

+0

它返回「¢H￶M$ = \ 0」「。奇怪:) 我認爲需要一種停止,如果我們得到一個NUL(因爲它的字符串的結尾) –

+0

@RobinWebdev你是否期待另一個字符串?哪一個?你是對的,我的方法不會在一個'\ 0'字符後停止。也許我的版本中'char'的順序不正確,但是角色應該和你想要的一樣?如果你想刪除第一個''\ 0''和後面的所有東西,可以嘗試'reconstructedStr = reconstructedStr.Remove(reconstructedStr.IndexOf('\ 0'));'(如果不是''\ 0''將失敗在那兒)。 –

+0

我期望更可讀的東西,因爲字符串被繪製到屏幕上。 Hmpf ... –

1

您可以創建一個逗號分隔的字符串是這樣的:

string str = String.Join(", ", intArray.Select(x => x.ToString()).ToArray()); 
+0

謝謝,但我需要字符串,因爲它存在於服務器端。這個任務是顛倒C++的功能,但在C#中沒有指針 –

+0

所以這是作業嗎 – Borgleader

+0

不是這是一個私人項目我工作我幾年前離開學校:) –

0
var ints = new[] {-14240, -12938, -16988, -8832}; 
    var result = string.Join("-", ints.Select(i => BitConverter.ToString(BitConverter.GetBytes(i)))); 
    Console.WriteLine(result); //60-C8-FF-FF-76-CD-FF-FF-A4-BD-FF-FF-80-DD-FF-FF 

BitConverter.ToString可以通過什麼來代替人在這裏,這取決於你如何將在稍後解析字符串。

+0

不錯,但我認爲你錯過了+ 128位在C++代碼中。 在我看來,它設置了每個字節的最後一位,所以我需要在轉換過程中取消該位。這將使每個字節代表一個可打印的ASCII字符。糾正我,如果我錯了,請... –