2009-11-30 6 views
1

J'essaie de lire un message SMS que je reçois. L'appel à SmsReadMessage se termine avec succès et je reçois le message dans un tableau d'octets. Voici la déclaration de SmsReadMessage:
SmsReadMessage et la conversion du tampon en chaîne

[DllImport("sms.dll", SetLastError=true)] 
    public static extern int SmsReadMessage(
     IntPtr smshHandle, 
     byte[] psmsaSMSCAddress, 
     byte[] psmsaSourceAddress, 
     byte[] pstReceiveTime, 
     byte[] pbBuffer, 
     int dwBufferSize, 
     byte[] pbProviderSpecificBuffer, 
     int dwProviderSpecificDataBuffer, 
     ref int pdwBytesRead); 

Maintenant, je voudrais convertir le tableau d'octets à une chaîne.
Ce qui suit n'a pas fonctionné pour moi (renvoie la valeur null):

Encoding.Unicode.GetString(pMessage, 0, Size); 

Comment convertir le tableau d'octets à chaîne?
Est-ce que je devrais changer la déclaration à quelque chose d'autre qui sera converti plus facilement? C'est le function's signature.


Mise à jour: qui suit réussit:

string test = ""; 
foreach (byte b in pMessage) 
{ 
    if (b != 0) 
    { 
     test += Convert.ToChar(b); 
    } 
} 

Le paramètre dwSize pour le message texte est 320 (le message envoyé à l'origine est inférieur à 160 caractères).
Cela peut être dû à un rapport incorrect par le pilote RIL sous-jacent. Cela pourrait également être la source de mon problème de conversion d'origine.
Je ne suis pas sûr qu'il y ait un caractère de fin à la fin.
Comment puis-je confirmer cela?

+0

Etes-vous sûr que le problème est avec la conversion et non la lecture? Est-ce que pBuffer et dwBufferSize ont des valeurs attendues après avoir appelé la fonction? – kgiannakakis

+0

J'ai mis à jour la question avec les informations requises. Merci! – Shaihi

+0

Si une traduction par octet fonctionne, utilisez Encoding.ASCII. Comme pour un terminateur, regardez simplement les données d'octets dans le tableau et voyez s'il y en a une. – ctacke

Répondre

0

J'ai eu une erreur stupide en assignant la chaîne retournée du décodage. C'est trop gênant de le poster ici même.
Le code ci-dessus dans la question fonctionne correctement.
Merci pour le soutien!

1

Cette question devrait être utile: vous pouvez utiliser l'espace de noms Microsoft.WindowsMobile.PocketOutlook si vous ciblez WM6 ou vous pouvez utiliser ce library.

Étant donné que Convert.ToChar (Byte) "réussit", le message n'est probablement pas codé en Unicode (UTF-16). En UTF-16, vous avez deux octets par caractère. Les caractères anglais seront mappés en '00 XX', c'est-à-dire un octet zéro suivi de la valeur du caractère.

Le codage UTF8 est probablement utilisé. Essayez d'autres encodages pour voir ce qui se passe.

+0

J'ai supprimé l'étiquette Windows Mobile. Il était là parce que je pensais que peut-être quelqu'un l'a fait dans le mobile. Les deux liens que vous avez donnés sont spécifiques à WinMo. Merci pour la réponse de toute façon. – Shaihi

+0

Le codage est Unicode. J'ai eu une erreur (très) stupide et c'est pourquoi j'ai pensé que je recevais null à la suite du décodage. Merci beaucoup pour l'aide. – Shaihi