C++ CLI structure de tableau d'octets
J'ai une structure qui représente un fil de format de paquet. Dans cette structure est un ensemble d'autres structures. J'ai génériques de code qui gère cela très bien pour la plupart des cas, mais ce tableau de structures de cas est de lancer le marshaller pour une boucle.
Code Unsafe est un no go car je ne peux pas obtenir un pointeur vers une struct avec un tableau (argh!).
Je peux le voir dans cette codeproject article qu'il y a un très joli générique approche impliquant C++/CLI qui va quelque chose comme...
public ref class Reader abstract sealed
{
public:
generic <typename T> where T : value class
static T Read(array<System::Byte>^ data)
{
T value;
pin_ptr<System::Byte> src = &data[0];
pin_ptr<T> dst = &value;
memcpy((void*)dst, (void*)src,
/*System::Runtime::InteropServices::Marshal::SizeOf(T::typeid)*/
sizeof(T));
return value;
}
};
Maintenant, si juste eu de la structure -> tableau d'octets /écrivain version je serais fixé! Merci à l'avance!
fait-il?
OriginalL'auteur JasonCoder | 2008-12-01
Vous devez vous connecter pour publier un commentaire.
À l'aide de memcpy pour copier un tableau d'octets en une structure est extrêmement dangereux si vous n'êtes pas le contrôle de l'octet à l'emballage de la structure. Il est plus sûr de marshall et unmarshall une structure un champ à la fois. Bien sûr, vous perdrez la fonction générique de l'exemple de code que vous avez donné.
Pour répondre à votre question (et d'examiner ce pseudo-code):
OriginalL'auteur grieve
Code non sécurisé peut être faite pour ce faire, en fait. Voir mon post sur la lecture des structures à partir du disque: Lecture des tableaux à partir de fichiers en C# sans copie supplémentaire.
OriginalL'auteur
Ce n'est probablement pas la bonne façon de faire. CLR est autorisé à ajouter du rembourrage, réorganiser les éléments et modifier la façon dont il est stocké dans la mémoire.
Si vous voulez faire cela, assurez-vous d'ajouter
[System.Runtime.InteropServices.StructLayout]
attribut de la force spécifique disposition de la mémoire pour la structure. En général, je vous suggère de ne pas salir avec disposition de mémoire .Types de réseau.OriginalL'auteur Mehrdad Afshari
Ne modifient pas la structure est certainement de bons conseils. J'utilise des quantités libérales de StructLayout attributs pour spécifier l'emballage, la mise en page et l'encodage des caractères. Tout coule bien.
Mon problème est juste que j'ai besoin d'un performant et de préférence solution générique. Les performances, car c'est un serveur d'application et générique pour l'élégance. Si vous regardez la codeproject lien, vous verrez que le StructureToPtr et PtrToStructure méthodes effectuer sur l'ordre de 20 fois plus lent qu'un simple dangereuses pointeur de la fonte. C'est l'un de ces domaines où le code unsafe est plein de gagner. C# ne laissez que vous avez des pointeurs vers des primitives (et c'est pas générique - ne peut pas obtenir un pointeur vers un générique), c'est pourquoi CLI.
Merci pour le psuedocode pleurer, je vais voir si il fait le travail et de faire rapport.
OriginalL'auteur JasonCoder
Suis-je raté quelque chose? Pourquoi ne pas créer un nouveau tableau de la même taille et initialiser chaque élément séparément dans une boucle?
À l'aide d'un tableau de byte de données est très dangereux, sauf si vous êtes ciblé sur une seule plate-forme... par exemple, votre méthode ne tient pas compte des différentes endianness entre la source et la destination des tableaux.
Quelque chose que je ne comprends pas vraiment au sujet de votre question est pourquoi avoir un tableau comme un membre de votre classe est à l'origine du problème. Si la classe vient de l'un .NET de la langue, vous devriez avoir aucun problème, sinon, vous devriez être en mesure de prendre le pointeur dans le code unsafe et l'initialisation d'un nouveau tableau en passant par les éléments pointés un par un (avec un code) et en les ajoutant à cela.
OriginalL'auteur jheriko