【发布时间】:2014-01-05 22:29:34
【问题描述】:
所以我正致力于将一小段代码从 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 中重新编写它的见解(尽管,如果我知道发生了什么,我肯定可以自己重新编写它,哈哈)。
一如既往,提前感谢大家。
【问题讨论】:
-
在我看来它正在交换字节/字/双字顺序(字节序转换)
-
这是字节反转码,用于在 little-endian 和 big-endian 之间进行转换。您可以使用 BitConverter.GetBytes() 和 Array.Reverse() 或使用 Skeet 的 MiscUtil。
标签: c++ vb.net visual-c++ code-conversion