0

所以我正致力于将一小段代码从 VC++ 移植到 .NET。我一直是一个 VB 的人,在 C# 中涉猎过一点,但并不多,对 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 中重新编写它的见解(尽管,如果我知道发生了什么,我肯定可以自己重新编写它,哈哈)。

与往常一样,提前感谢大家。

4

1 回答 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

于 2014-01-05T22:40:08.363 回答