2012-12-01 52 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字符。纠正我,如果我错了,请... –