【问题标题】:VC++ To VB.NET Code ConversionVC++ 到 VB.NET 代码转换
【发布时间】: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


【解决方案1】:

这些宏反转整数类型变量中的字节: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

最后

0x0012 | 0x3400 将导致 0x3412

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多