如何从`std :: vector <uint8_t>`转换为`std :: vector <int8_t>`?

时间:2020-09-23 21:28:37

标签: c++ casting

我需要将数据填充到SetByteArrayRegion:

void JNIEnv::SetByteArrayRegion(jbyteArray array, jsize start, jsize len, const jbyte *buf)

其中jbyte就是int8_t。我的向量为uint8_t。为什么我不能将其转换为int8_t的向量? uint8_tint8_t的大小相同,因此可以轻松投射。

std::vector<uint8_t> messageResponseVector_ = //...
std::vector<int8_t> messageResponseVector = static_cast<std::vector<int8_t>>(messageResponseVector_);//does not work

在这种情况下最好做什么?我收到的向量为std::vector<uint8_t>。我可以通过for循环轻松转换为std::vector<int8_t>,但是有没有更简单的方法?

2 个答案:

答案 0 :(得分:1)

#include <vector>
#include <algorithm>
int foo() {
    std::vector<uint8_t> messageResponseVector_;
    std::vector<int8_t> messageResponseVector2(messageResponseVector_.begin(), messageResponseVector_.end());
}

答案 1 :(得分:1)

您不能将vector<uint8_t>强制转换为vector<int8_t>,它们是完全独立且无关的类型。但是,您可以改为投射 data ,例如:

std::vector<uint8_t> messageResponseVector_ = //...
jbyte *data = reinterpret_cast<jbyte*>(messageResponseVector_.data());
env->SetByteArrayRegion(array, 0, messageResponseVector_.size(), data);

但是,由于严格的别名规则,从技术上来说,这是未定义的行为。 更安全选项是简单地将数据复制到单独的vector<jbyte>中,例如:

std::vector<uint8_t> messageResponseVector_ = //...
std::vector<jbyte> messageResponseVector2_(messageResponseVector_.begin(), messageResponseVector_.end());
jbyte *data = messageResponseVector2_.data();
env->SetByteArrayRegion(array, 0, messageResponseVector2_.size(), data);

否则,请查看是否可以更改代码以将messageResponseVector_接收为vector<int8_t>(如果不是vector<jbyte>)作为开头,

std::vector<int8_t> messageResponseVector_ = //...
jbyte *data = reinterpret_cast<jbyte*>(messageResponseVector_.data());
env->SetByteArrayRegion(array, 0, messageResponseVector2_.size(), data);