Преобразование кода VC ++ в VB.NET

0

Поэтому я работаю над переносом очень маленького фрагмента кода из VC++ в.NET. Я всегда был парнем VB, немного ругался на С#, но не очень, и мало знаю в VC++. Да, я знаю, это, вероятно, плохая идея, чтобы попытаться передать код с языка, о котором вы ничего не знаете, но я не вижу смысла уделять лишнее время изучать язык и из языка ради переноса пара сотен строк кода. Мне удалось научиться достаточно, чтобы многое переместить, но что-то еще неясно. Вот код VC++:

#define ES16(_val) \
((u16)(((((u16)_val) & 0xff00) >> 8) | \
       ((((u16)_val) & 0x00ff) << 8)))

#define ES32(_val) \
((u32)(((((u32)_val) & 0xff000000) >> 24) | \
       ((((u32)_val) & 0x00ff0000) >> 8 ) | \
       ((((u32)_val) & 0x0000ff00) << 8 ) | \
       ((((u32)_val) & 0x000000ff) << 24)))

#define ES64(_val) \
((u64)(((((u64)_val) & 0xff00000000000000ull) >> 56) | \
       ((((u64)_val) & 0x00ff000000000000ull) >> 40) | \
       ((((u64)_val) & 0x0000ff0000000000ull) >> 24) | \
       ((((u64)_val) & 0x000000ff00000000ull) >> 8 ) | \
       ((((u64)_val) & 0x00000000ff000000ull) << 8 ) | \
       ((((u64)_val) & 0x0000000000ff0000ull) << 24) | \
       ((((u64)_val) & 0x000000000000ff00ull) << 40) | \
       ((((u64)_val) & 0x00000000000000ffull) << 56)))

Может кто-нибудь объяснить, что здесь происходит? И, возможно, немного поразмышляем над тем, как переписать это в VB.NET (хотя, если бы я знал, что происходит, я мог бы переписать его сам, ха-ха).

Как всегда, заранее спасибо всем.

  • 0
    Похоже, меняется порядок байтов / слов / слов (обратное преобразование)
  • 1
    Это код обращения байтов для преобразования между прямым и прямым порядком байтов. Вы можете сделать это с помощью BitConverter.GetBytes () и Array.Reverse () или использовать MiscUtil от Skeet.
Теги:
visual-c++
code-conversion

1 ответ

0
Лучший ответ

Эти макросы обращают байты в переменных интегральных типов: short, unsigned short, int, unsigned int, long long и unsigned long long (при условии, что они имеют соответственно размеры 16, 32 и 64 бит). Например, если существует некоторая переменная типа unsigned short, которая имеет значение 0x1234, то после применения первого макроса ES16 (0x1234) результат будет равен 0x3412.

Чтобы было более понятно рассмотреть шаг, свернув действие макроса

((u16) _val) & 0xff00) будет равна 0x1200, тогда

0x1200 >> 8 будет равна 0x0012

((u16) _val) & 0x00ff) будет равна 0x0034

тогда

0x0034 << 8 будет равно 0x3400

И наконец

0x0012 | 0x3400 приведет к 0x3412

Ещё вопросы

Сообщество Overcoder
Наверх
Меню