便携式ntohl和朋友

时间:2015-03-10 15:06:57

标签: c++ standards

我正在编写一个保存和加载数据的小程序,它将是命令行(而不是交互式),因此包含我不需要包含的库是没有意义的。

直接使用套接字时,我只是通过包含套接字来获取ntohl函数,但是这里我不需要套接字。我没有使用wxWidgets,所以我不能使用它的字节排序函数。

在C ++中有很多新的标准化的东西,例如看看计时器和正则表达式(尽管还没有完全支持),但肯定是计时器!

是否有标准化的方法将事物转换为有序的网络字节?

当然我试过搜索“c ++网络字节顺序cppreference”和类似的东西,什么都没有出现。

在这个小项目中BTW,该程序将操纵可能在计算机之间共享的文件,假设“总是x86_64”是错误的

5 个答案:

答案 0 :(得分:0)

  

是否有标准化的方法将事物转换为网络字节有序?

否。没有。

Boost ASIO has equivalents,但这有点违反了您的要求。

答案 1 :(得分:0)

没有C ++标准函数,但您可以从C ++标准函数中组合所需的功能。

Big-endian-to-host字节顺序转换可以按如下方式实现:

#include <boost/detail/endian.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_arithmetic.hpp>
#include <algorithm>

#ifdef BOOST_LITTLE_ENDIAN
#   define BE_TO_HOST_COPY std::reverse_copy
#elif defined(BOOST_BIG_ENDIAN)
#   define BE_TO_HOST_COPY std::copy
#endif

inline void be_to_host(void* dst, void const* src, size_t n) {
    char const* csrc = static_cast<char const*>(src);
    BE_TO_HOST_COPY(csrc, csrc + n, static_cast<char*>(dst));
}

template<class T>
typename boost::enable_if<boost::is_integral<T>, T>::type
be_to_host(T const& big_endian) {
    T host;
    be_to_host(&host, &big_endian, sizeof(T));
    return host;
}

主机到大端的字节顺序转换可以用相同的方式实现。

用法:

uint64_t big_endian_piece_of_data;
uint64_t host_piece_of_data = be_to_host(big_endian_piece_of_data);

答案 2 :(得分:0)

以下内容可以在任何endian平台上正常运行

int32_t getPlatformInt(uint8_t* bytes, size_t num)
{
    int32_t ret;
    assert(num == 4);
    ret = bytes[0] << 24;
    ret |= bytes[1] << 16;
    ret |= bytes[2] << 8;
    ret |= bytes[3];
    return ret;

}

使用以下命令可以轻松地将网络整数强制转换为字符数组:

uint8_t* p = reiterpret_cast<uint8_t*>(&network_byte_order_int)

答案 3 :(得分:0)

海湾合作委员会有__BYTE_ORDER__,它会得到最好的!如果编译器是GCC并且测试这个宏,或者检测它是否是Clang并测试它,那么很容易检测到,然后将字节顺序粘贴在配置文件中并使用预处理器有条件地编译代码位。

答案 4 :(得分:0)

Doron的代码应该在任何平台上工作在大端系统(Power7 CPU架构)上对我不起作用。

使用编译器built_in更清晰,对我来说非常适合在Windows和* nix(AIX)上使用gcc:

uint32_t getPlatformInt(const uint32_t* bytes) 
  {
    uint32_t ret;
    ret = __builtin_bswap32 (*bytes));
    return ret;
  }

另见How can I reorder the bytes of an integer in c?