所以我正在努力将一小段代码从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中重写它的一些见解(虽然,如果我知道发生了什么,我肯定可以自己重写它,哈哈)。
一如既往,先谢谢大家。
答案 0 :(得分:0)
这些宏在整数类型的变量中反转字节:short,unsigned short,int,unsigned int,long long和unsigned long long(假设它们具有相应大小的16,32和64位)。 例如,如果某个无符号short类型的变量值为0x1234,那么在应用第一个宏ES16(0x1234)之后,结果将为0x3412。
更明确的是,考虑一步一步地消除宏的行动
((u16)_val)&amp; 0xff00)将等于0x1200 然后
0x1200&gt;&gt; 8将等于0x0012
((u16)_val)&amp; 0x00ff)将等于0x0034
然后
0x0034&lt;&lt; 8将等于0x3400
最后
0x0012 | 0x3400将导致0x3412