【问题标题】:Visual Studio Determine EndiannessVisual Studio 确定字节顺序
【发布时间】:2015-03-18 03:42:25
【问题描述】:

所以我制作了一些音频处理 dll,我想知道如何确定处理器的字节顺序。我知道 Visual Studio 定义了一些处理器宏,但我找不到它们的完整列表。我希望这是一个编译时检查,因为我可能会为不同的处理器编译它。

编辑:我也是针对 windows 的。听说 Windows 只使用小尾数,是真的吗?

【问题讨论】:

  • Windows NT 在 MIPS、DEC Alpha 和 PowerPC CPU:s 上运行,它们都是 Big Endian。但是,对这些 CPU 的支持在 Windows 2000 中被删除了。因此,除非您以 Windows NT 为目标,否则您可以放心地假定系统是 Litte Endian。
  • 我听说 Windows 只能在 little endian 机器上运行。但令人惊讶的是,公式:bigEndian = 'x\0\0\0' & 'x' littleEndian = '\0\0\0x' & 'x' 不起作用。至少适用于 64 位窗口。

标签: visual-c++ visual-studio-2012 audio-streaming endianness processor


【解决方案1】:

我找到了一种使用 C 预处理器确定字节顺序的方法。

请注意,我没有在大端机器上测试此代码

它使用一些注册表值类型 [1] 的定义。

REG_DWORD 在那里定义为 Windows 运行的架构的字节序。

_byteswap_TYPE 函数添加到组合中,我们可以编写预处理器定义 [2]。

#include <Windows.h>

#if REG_DWORD == REG_DWORD_LITTLE_ENDIAN
# define le_to_host_ulong(VAL) VAL
# define be_to_host_ulong(VAL) _byteswap_ulong(VAL)
# define le_to_host_ushort(VAL) VAL
# define be_to_host_ushort(VAL) _byteswap_ushort(VAL)
# define le_to_host_uint64(VAL) VAL
# define be_to_host_uint64(VAL) _byteswap_uint64(VAL)
#else
# define le_to_host_ulong(VAL) _byteswap_ulong(VAL)
# define be_to_host_ulong(VAL) VAL
# define le_to_host_ushort(VAL) _byteswap_ushort(VAL)
# define be_to_host_ushort(VAL) VAL
# define le_to_host_uint64(VAL) _byteswap_uint64(VAL)
# define be_to_host_uint64(VAL) VAL
#endif

[1]https://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx

[2]https://msdn.microsoft.com/en-us/library/a3140177.aspx

【讨论】:

    【解决方案2】:

    Visual Studio 仅提供识别平台的预处理器宏(例如_WIN32 等)。可以在此处找到完整列表:https://msdn.microsoft.com/en-us/library/b0084kay.aspx。不幸的是,它没有提供任何识别字节序的方法。从该列表中的平台目标宏中,您必须确定该平台是大端还是小端。正如这个问题的答案 (Can I safely assume that Windows installations will always be little-endian?) 中所述,Windows x86/x64 始终是小端。

    但是,不能保证未来的 Windows 更新不会针对大端处理器,但在这种情况下,此列表可能会更新。另请注意,具有不同编译器的 Visual Studio 目前针对的是大端的非 Windows 平台(例如 Xbox 360)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      相关资源
      最近更新 更多