2015-03-23 1 views
0

Lecture d'un fichier créé dans une application mfc à l'aide de CFile dans C# à l'aide du fichier memorymappedfile. Mais il montre l'erreur ci-dessous lors de l'exécution.Erreur lors de la lecture du fichier MFC dans C# à l'aide du fichier memorymappedfile

le flux d'entrée n'est pas un format binaire valide. Le contenu de départ (en octets) est: 45-53-49-4D-20-00-31-30-30-00-00-42-4C-43-30-31-00 ...

Code CFile dans MFC:

char TempCharData[25]; 
TempInfo = Temp->GetTagName();   //Tag Name 
memset(TempCharData,0,25); 
strncpy(TempCharData,(const char *)TempInfo,TempInfo.GetLength()); 
ofTag.Write(TempCharData,(int)TagNameLength); 
TempInfo = Temp->GetDescription();  // Description 
memset(TempCharData,0,25); 
strncpy(TempCharData,(const char *)TempInfo,TempInfo.GetLength()); 
ofTag.Write(TempCharData,24); 

Im lecture de ce fichier dans C# comme ci-dessous:

MemoryMappedFile mmf1 = MemoryMappedFile.CreateFromFile("C:\\BL001\\YCS\\Tag.YCS", FileMode.Open); 
MemoryMappedViewAccessor mmfReader = mmf1.CreateViewAccessor(); 
byte[] buffer = new byte[mmfReader.Capacity]; 
mmfReader.ReadArray<byte>(0, buffer, 0, buffer.Length); 
BinaryFormatter binaryFormatter = new BinaryFormatter();  
MemoryStream memoryStream = new MemoryStream(buffer);  
return binaryFormatter.Deserialize(memoryStream); //Shows error here 
+0

Cela ne peut jamais travailler, BinaryFormatter.Deserialize() ne peut jamais désérialiser un objet qui a été écrit par sa méthode Serialize(). Pas le cas ici bien sûr, MFC connaît des beans sur BinaryFormatter. Vous devrez utiliser BinaryReader. –

Répondre

1

le problème est pas dans la lecture du fichier, mais dans désérialisation. Le BinaryFormatter ne peut pas déterminer ce qui est stocké dans le fichier. Si vous voulez obtenir deux chaînes à partir du fichier, vous devez écrire votre propre TextReader ou utiliser les classes existantes (BinaryReader ou StreamReader) et modifier le fichier C++. Je vais écrire seulement sur l'utilisation BinaryReader parce que c'est la manière la plus facile.

BinaryReader peut lire des chaînes si elles sont écrites dans le format suivant:

[longueur] [caractères]

    longueur
  • - longueur codé sur 7 bits en octets d'une chaîne de follolowing.
  • caractères - Les charactes de chaîne

C++ fichier:

void Write7BitEncodedInt(CFile& file, int strLen) 
{ 
    char lenPart; 

    while (strLen >= 128) 
    { 
     lenPart = (char)(strLen | 128); 
     file.Write(&lenPart, 1); 
     strLen >>= 7; 
    } 

    lenPart = (char)strLen; 
    file.Write(&lenPart, 1); 
} 

// Use this function to write strings to the file 
void WriteString(CFile& file, CString& str) 
{ 
    const char* chars = str; 
    int strLen = str.GetLength(); 

    Write7BitEncodedInt(file, strLen); 
    file.Write(chars, strLen); 
} 

fichier C#:

var mmf = MemoryMappedFile.CreateFromFile("C:\\BL001\\YCS\\Tag.YCS", FileMode.Open); 
var mmfReader = mmf.CreateViewAccessor(); 
var buffer = new byte[mmfReader.Capacity]; 

mmfReader.ReadArray<byte>(0, buffer, 0, buffer.Length); 

using (var ms = new MemoryStream(buffer)) 
{ 
    var reader = new BinaryReader(ms, Encoding.ASCII); 

    var tag = reader.ReadString(); 
    var description = reader.ReadString(); 
}