2012-12-01 6 views
0

Salut Je développe une application cliente en C# et le serveur est écrit en C++int [] à chaîne C#

le serveur utilise:

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; 
} 

pour convertir une chaîne en int []

dans mon C# client je reçois:

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

Comment puis-je convertir le tableau arrière à une chaîne? Je ne veux pas utiliser de code dangereux (par exemple, des pointeurs) N'importe lequel de mes essais a abouti à des chaînes illisibles.

EDIT: Voici un de mes approch:

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(); 
} 

Je sais que je dois prendre soin de endianess mais que le serveur est en cours d'exécution sur ma machine locale et le serveur aussi, je suppose que cela est Pas de problème.
Mon autre essai a consisté à utiliser une structure avec une disposition explicite et le même FieldOffset pour les entiers et les caractères, mais cela ne fonctionne pas non plus.

+2

À quoi devrait ressembler la chaîne de résultats? –

+1

Qu'avez-vous essayé jusqu'à présent? S'il vous plaît partager votre code, je m'attends à quelque chose ce qui fait déjà tous les changements de bits – sll

+0

Voulez-vous retourner un tableau de chaîne ou une seule chaîne (csv) –

Répondre

1

Peut-être essayer quelque chose comme (LINQ):

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

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

Non testé, mais il y a quelque chose à partir. Je ne sais pas si la soustraction de 128 est correcte.

+0

Il renvoie "¢ H￶M $ = \ 0]". Étrange :) Je pense qu'il doit y avoir une sorte d'arrêt si nous avons un NUL (parce que c'est la fin d'une chaîne) –

+0

@RobinWebdev Avez-vous prévu une autre chaîne? Laquelle? Vous avez raison, mon approche ne s'arrête pas après un caractère «\ 0». Peut-être que l'ordre du 'char' n'est pas correct dans ma version non plus, mais les caractères devraient être les mêmes que vous voulez? Si vous voulez supprimer le premier ''\ 0' 'et tout ce qui suit, essayez' reconstructedStr = reconstructedStr.Remove (reconstructedStr.IndexOf (' \ 0 ')); '(échouera si non' '\ 0'' y a-t-il). –

+0

Je m'attendais à quelque chose de plus lisible parce que la chaîne est dessinée à l'écran. Hmpf ... –

1

Vous pouvez créer une chaîne séparées par des virgules cette façon:

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

Merci, mais j'ai besoin de la chaîne comme il existe côté serveur. La tâche est d'inverser la fonction C++ mais en C# sans pointeurs –

+0

Donc c'est un travail à faire? – Borgleader

+0

Non c'est un projet privé sur lequel je travaille, j'ai quitté l'école il y a quelques années :) –

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 peut être remplacé par quelque chose d'autre ici, selon la façon dont vous analyser plus tard chaîne.

+0

Pas mal, mais je pense que vous avez raté le + 128 dans le code C++. À mon avis, il définit le dernier bit dans chaque octet, donc j'ai besoin de désactiver le bit lors de la conversion en arrière? Cela ferait que chaque octet représenterait un caractère ASCII imprimable. Corrigez-moi si je me trompe s'il vous plaît ... –