Структурировать в ubyte[] или ubyte[] в struct для языка d

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

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

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

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

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

4 ответа

Решение

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

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

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

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

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

struct UserLogin
{
  align(1): 
  ushort ClientId; 
  int AccectId; 
  char[10] LoginUid; 
  char[10] LoginPwd; 
}

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

Будет ли возможность правильно принять данные...

Другие вопросы по тегам