2014-01-05 3 views
0

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

#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

Похоже, что это замена байта/слова/порядка dword (endian conversion) – Zenilogix

+1

Это байтовый код разворота для преобразования между мало-endian и big-endian. Вы можете сделать это с помощью BitConverter.GetBytes() и Array.Reverse() или использовать Sketch's MiscUtil. –

ответ

0

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

Это было бы более понятно, рассмотрим шаг за steap действие макроса

((U16) _val) & 0xFF00) будет равен 0x1200 тогда

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

((U16) _val) & 0x00FF) будет равен 0x0034

затем

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

И наконец

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

Смежные вопросы