C++ code for do Python struct.pack('>I',val)
C++ code for do Python struct.pack('>I',val)
我有 Python 代码struct.pack('>I',val)
其中val
是任何数字,我如何在C++中做到这一点。
我知道struct.pack
如果设置为">I",则在无符号整数中以大端字节顺序返回字节字符串,但是我如何在C++中做到这一点。
我知道这个函数的完整模拟存在于C++中,但也许我可以用一些C++代码来做到这一点?谢谢!
根据文档,struct.pack('>I',val)
将 32 位无符号整数转换为大端格式的字符串。等效C++代码很容易使用位运算符实现,通常如下所示:
std::string pack_uint32_be(uint32_t val) {
unsigned char packed[4];
packed[0] = val >> 24;
packed[1] = val >> 16 & 0xff;
packed[2] = val >> 8 & 0xff;
packed[3] = val & 0xff;
return std::string(packed, packed + 4);
}
您可以找到大量在不同字节序之间进行转换的现有函数,但在标准C++中没有一个。例如,BSD 网络实现附带并由 POSIX 标准化的 htonl
函数返回一个数字,其内存中的表示形式是给定值的大端版本。使用htonl
,pack_uint32_be
可以实现为:
std::string pack_uint32_be(uint32_t val) {
uint32_t packed_val = htonl(val);
auto packed_ptr = reinterpret_cast<const char *>(&packed_val);
return std::string(packed_ptr, packed_ptr + 4);
}
这两个函数都假定包含std::string
的<string>
和uint32_t
的<cstdint>
(或等效项)。后一个功能还需要包含arpa/inet.hr
或其Windows等效项htonl
。
相关文章:
- EASTL矢量<向量<int>>连续的
- 'val' Arduino 错误代码之前的预期'('
- C++算法标头中,为什么要使用 "!(val < *first)" ?
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- 为什么 std::find( s.begin(), s.end(), val ) 比集合 s 的 s.find(val) 慢 1000 倍<int>?
- APInt(unsigned numBits, uint64_t val, bool isSigned = false)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 在模板元编程中使用"struct xxx<>::val"导致错误
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- SWIG:包装 std::map<key 时编译器错误,val *>
- C++ std::map::find to C# 字典<键,val>
- val != std::numeric_limits:<double>:infinity() 或 !isinf(val) 或 isfinite(val)
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型