преобразование C в C # - PullRequest
       11

преобразование C в C #

0 голосов
/ 28 ноября 2011

Я пытаюсь преобразовать этот код C в C #, есть ли C #, эквивалентный C union typedef?

struct sockaddr_in {
    short   sin_family;
    u_short sin_port;
    struct  in_addr sin_addr;
    char    sin_zero[8];
};

typedef struct in_addr {
  union {
    struct {
      u_char s_b1,s_b2,s_b3,s_b4;
    } S_un_b;
    struct {
      u_short s_w1,s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
 } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 ноября 2011

Вы можете проверить следующую страницу . При этом в .NET есть классы, которые позволяют вам работать напрямую с сокетами и TCP / IP, такими как Socket, TcpListener, TcpClient, и вам не нужно переводить код C вслепую.

2 голосов
/ 28 ноября 2011

Хотя у других определенно есть смысл - это, вероятно, то, что вам действительно не нужно делать - там есть способ симуляции союзов в C # с использованием StructLayoutAttribute (пример симуляции объединения здесь ).

Но не делай этого. Похоже, что цель этого объединения C состоит в том, чтобы разрешить разделение битов по 4 байта длиной. Использование объединения таким образом зависит от знания порядка следования байтов целевой архитектуры, чего C # не может гарантировать.

В C # - или на любом другом языке, где важна переносимость - если вы хотите получить или установить старший байт / младший байт / и т.д., вам нужно использовать явное смещение битов, как объяснено здесь .

Но тогда тоже не делай этого. Делайте как другие, и не переносите этот код. Кто-то уже сделал это для вас, скорее всего, Microsoft во встроенных библиотеках;).

...