struct to ubyte [] или ubyte [], чтобы структурировать для языка d - PullRequest
4 голосов
/ 25 февраля 2012

Как реализация структуры в языке D для ubyte [] или ubyte [] для структуры, пожалуйста, братья, помогите ответить на этот вопрос, спасибо!

Если структура содержит string илиchar [] что делать?

Например, такая структура:

struct UserLogin 
{ 
    align(1): 
      ushort ClientId; 
      int AccectId; 
      string LoginUid; 
      string LoginPwd; 
} 

Внимание к моему приложению в сокете!

Ответы [ 4 ]

6 голосов
/ 25 февраля 2012

Я не думаю, что в стандартной библиотеке есть что-то для автоматической сериализации и десериализации структур в байтовые потоки.std.stream делает это для множества основных типов, но не для целых структур.Поддержка Apache Thrift уже в пути.Среди сторонних решений вы можете ознакомиться с библиотекой сериализации Orange .

4 голосов
/ 26 февраля 2012

Чтобы преобразовать необработанные данные, предложенная идиома выглядит следующим образом:

struct_type* s = new struct_type;
ubyte[] ub = cast(ubyte[]) s[0..1];
struct_type* s2 = cast(struct_type*) ub.ptr;

Это не будет обрабатывать сериализацию строк и указателей. Вам нужно будет сделать это вручную или с помощью библиотеки.

2 голосов
/ 25 февраля 2012

@ Dev Wolf: Вы должны написать сериализацию / десериализацию самостоятельно.Помимо Orange, упомянутого CyberShadow, у вас также есть реализация протокола Thrift: http://klickverbot.at/code/gsoc/thrift/.Я помню, что некоторые ребята тоже работали над реализацией Google Protocol Buffer.

0 голосов
/ 27 февраля 2012
struct UserLogin
{
  align(1): 
  ushort ClientId; 
  int AccectId; 
  char[10] LoginUid; 
  char[10] LoginPwd; 
}

UserLogin* readByteToStruct = cast(UserLogin*)ne.data;

сможет правильно брать данные ...

...