将大端字节数组转换为 int,如 python 中的 struct.unpack

Posted

技术标签:

【中文标题】将大端字节数组转换为 int,如 python 中的 struct.unpack【英文标题】:Convert big-endian bytes array to int like struct.unpack in python 【发布时间】:2021-08-27 12:43:23 【问题描述】:

最近我正在尝试将 python 串行数据分析器转换为 c++,但我面临一个问题,即如何将 feff 转换为 c++ 中的整数 -2,这是我的 python 代码的一部分。

def Control_Message(input_):
    print(input_[4:8])
    print(bytes.fromhex(input_[4:8]))
    print(struct.unpack('h', bytes.fromhex(input_[4:8])))
    print(struct.unpack('h', bytes.fromhex(input_[4:8]))[0])
    Angular_Rate_X = struct.unpack('h', bytes.fromhex(input_[0:4]))[0] * 600 * 2 ** -20

结果是:

feff
b'\xfe\xff'
(-2,)
-2

现在我很困惑,我怎么能在 c++ 中做同样的事情,希望你的帮助,谢谢!

【问题讨论】:

您是否尝试过在您的 C++ 教科书中寻找这样做的示例?你试过什么?此类基本字节操作的示例总是可以在介绍性 C 和 C++ 教科书中找到。 @SamVarshavchik 谢谢你的回答!我尝试用谷歌搜索这个解决方案,但我失败了。我是 c++ 新手,我现在就去检查我的 c 入门, @Kniok 当您将 feff 转换为整数时,您会得到 65279。您能解释一下尝试将其转换为 2 的含义吗? @east1000 这正是 2 的补码……我从来没想过。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:
#include <cstdint>
#include <iostream>

int main() 
    uint16_t value = 0xfeff;
    uint8_t firstByte = static_cast<uint8_t>((value & 0xFF00) >> 8);
    uint8_t secondByte = static_cast<uint8_t>(value & 0x00FF);
    std::cout << std::hex << static_cast<int>(firstByte) << "\n";
    std::cout << std::hex << static_cast<int>(secondByte) << "\n";

输出:

fe
ff

如果您的目标是分别获取 fe 和 ff,然后将它们视为整数,请执行以下操作。

#include <cstdint>
#include <iostream>

int main() 
    uint16_t value = 0xfeff;
    uint8_t firstByte = static_cast<uint8_t>((value & 0xFF00) >> 8);
    uint8_t secondByte = static_cast<uint8_t>(value & 0x00FF);
    std::cout  << static_cast<int>(firstByte) << "\n";
    std::cout  << static_cast<int>(secondByte) << "\n";

输出:

254
255

如果您的目标是找到 feff 的整数值,请执行以下操作

#include <cstdint>
#include <iostream>

int main() 
    uint16_t value = 0xfeff;
    std::cout  << static_cast<int>(value) << "\n";

输出:

65279

【讨论】:

感谢您的帮助!我发现我需要的是 little-endian 补码计算,而不是简单的转换。现在我有了解决方案! @Kniok 欢迎您,如果您能将我的答案标记为您问题的答案,我将不胜感激,以便其他人可以更好地从答案中受益。

以上是关于将大端字节数组转换为 int,如 python 中的 struct.unpack的主要内容,如果未能解决你的问题,请参考以下文章

将可变大小的字节数组转换为整数/长整数

如何在 Objective-C 中将 int 转换为字节?

大小端模式

将大端转换为小端的 C/C++ 代码

C语言中long转换成int是将低位给int吗

将字节数组转换为java类型