2009-11-08 4 views
-1

Je convertis un nombre entier en binaire et le place dans un en-tête d'un message de données. Par exemple le premier meesage qui est arrivé, je convertirais le compteur en binaire qui prend 4 octets et ai eu le message de données, qui est un message de reguler contenant a, b, c etc '.C# binaire en chaîne

Voici comment je convertir le compteur:

//This is preparing the counter as binaryint 
nCtrIn = ...; 
int nCtrInNetwork = System.Net.IPAddress.HostToNetworkOrder(nCtrIn); 
byte[] ArraybyteFormat = BitConverter.GetBytes(nCtrInNetwork); 

Maintenant, le problème est que maintenant pour prendre une chaîne de utre copier le byteFormat au début d'une chaîne et en plus d'ajouter les données de chaîne.

Je le fais parce que je veux seulement à la fin d'écrire dans le fichier en utilisant l'écrivain binaire

m_brWriter.Write(ArraybyteFormat); 
m_brWriter.Flush(); 
+0

Il m'a fallu du temps pour comprendre cette question, et je ne peux toujours pas. Peut-être que je suis groggy ou quelque chose, mais je crois que la grammaire peut (et devrait) être améliorée. –

+0

Et pourquoi n'utilisez-vous pas simplement m_brWriter.Write (myString) après m_brWriter.Write (byteFormat)? – Heinzi

+0

Comme mentionné, j'ai besoin tout d'abord de la conversion de binaire en une chaîne et ajouter la chaîne d'origine à elle et seulement que de l'écrire dans le fichier –

Répondre

1

S'il est important d'écrire dans le flux en appel unique, vous pouvez concaténer les tableaux:

var intArray = new byte[4];  // In real code assign 
var stringArray = new byte[12]; // actual arrays 

var concatenated = new byte[16]; 
intArray.CopyTo(concatenated, 0); 
stringArray.CopyTo(concatenated, 4); 

m_brWriter.Write(concatenated); 
m_brWriter.Flush(); 

Avez-vous envisagé d'écrire les tableaux dans deux appels à Écrire?

+0

Non doit écrire dans un appel –

+0

"doit écrire dans un appel": Pourquoi? C'est la nature des cours d'eau que cela n'a pas d'importance. Un flux va tamponner et se fragmenter si nécessaire. –

+0

Je dois écrire en un appel, parce que je prends un grand tampon beaucoup de messages et puis les rincer. Je sais que je peux écrire quelques fois une fois puis flush une fois, mais le système est construit, donc je ne permet pas de le faire, il va briser la conception du système. –

1

Vous pouvez simplifier en laissant BinaryWriter écrire directement l'int - pas besoin de converger vers byte[] en premier.

L'autre problème est écrit le message, il peut être fait comme:

m_brWriter.Write(nCounterIn); 
string msg = ....; // get it as 1 big string 
byte[] textData = Encoding.UTF8.GetBytes(msg); 
m_brWriter.Write(textData); 

Ou, encore plus facile et plus facile à lire en arrière:

m_brWriter.Write(nCounterIn); 
m_brWriter.Write(msg); 

Mais notez que le BinaryWriter va maintenant mettre son propre préfixe lentgh-en face de la chaîne.

+0

Bonne réponse mais avec une mise en garde de ma part - elle suppose la même endianess dans le fichier de sortie. Nitpicking Je sais mais dans les jeux je dois souvent sérialiser en big-endian. – zebrabox

+0

Pouvez-vous expliquer plus sur le problème, je ne l'ai pas compris tellement –

+0

Roma, regardez le code. Un BinaryWriter utilisera son propre BitConverter, de sorte que vous pouvez écrire _nCounterIn_ directement. Et puis s'inquiéter de l'écriture d'un __string__ en binaire. –