2016-11-27 1 views
2

Je voudrais savoir comment puis-je définir une classe pour un fichier binaire qui contient des objets avec réseau de flotteurs de taille 19.Comment définir une classe à deserialze fichier binaire

s'il vous plaît voir la photo ci-jointe de la façon dont les données ressemble à dans l'éditeur hexadécimal Neo. lorsqu'il est affiché comme flotteur

enter image description here

j'ai essayé la suite, mais pas de chance. S'il vous plaît dites ce que je fais mal ici.

[ProtoContract] 
public class ChannelData 
{ 
    [ProtoMember(1)] 
    public List<float> array = new List<float>(19); 
} 

using (var file = File.OpenRead("0.cnl")) 
{ 
    ChannelData newchannel = Serializer.Deserialize<ChannelData>(file); 
} 

J'utilise protobuff pour désérialiser. Je vous remercie!

ce fichier binaire n'est pas sérialisé à l'aide d'un sérialiseur binaire son fichier brut. alors je pense qu'il ne peut pas être désérialisé en utilisant un désérialiseur? peut être nécessaire de le faire avec BitConverter mais ont aucune idée ..

+0

devrait-il pas '[ProtoMember (0)] '? – NtFreX

+0

oh mai mauvais en fait je viens de trouver ce fichier binaire n'est pas sérialisé en utilisant un sérialiseur binaire, il n'a pas d'attributs. donc je pense qu'il ne peut pas être désérialisé en utilisant un désérialiseur? peut être besoin de faire avec BitConverter, mais n'ont aucune idée ... :( – user964829

+0

dans la mesure où ma compréhension des tampons de protocole va, j'ai compris qu'aucun attributs sont écrits dans le fichier et que le sérialiseur/désérialiseur doit connaître le format/le bitconverter est seulement pour la sérialisation et la désérialisation simple de type de données .. vous devez analyser plusieurs – NtFreX

Répondre

0

Vous pouvez charger des flotteurs à la liste, puis diviser aux canaux, comme

public static unsafe List<float> LoadToList(byte[] bytes) 
    { 
     var list = new List<float>(); 
     var step = sizeof (float); 
     for (int i = 0; i < bytes.Length; i += step) 
     { 
      fixed (byte* pbyte = &bytes[i]) 
      { 
       list.Add(*((float*)pbyte)); 
      } 
     } 

     return list; 
    } 
+0

parfait c'est exactement ce que je cherchais merci. – user964829