8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

使用 std::vector::insert 将字符串插入 uint8_t 向量中,将随机数据放入其中

Staša Sekulić 2月前

41 0

我正在将数据序列化为 uint8_t 向量以将其发送到另一个模块,我有一个从函数 getVal() 返回的字符串,当我执行 vector.insert() 时,它会显示更多的随机值...

我正在将数据序列化为一个 vector uint8_t 将其发送到另一个模块,我有一个从函数返回的字符串 getVal() ,当我执行 vector.insert() 此操作时,它会在我的向量中显示更多的随机值。


std::string getVal() 
{
    std::string x = "564";
    return x ; 
}

int main() 
{ 
    std::vector<uint8_t> data {0x70}; 

    data.insert(data.end(),getVal().begin(),getVal().end());

    for (auto i:data)
        std::cout << i <<std::endl; 
    
    std::cout<<data.size()<<std::endl;
    std::cout << getVal() <<" ,type: "<< sizeof(getVal()) << ", .size(): "<< getVal().size()<<std::endl; 


    return 0; 
}

感谢你的帮助。

解决方案是循环遍历字符串并使用 .push_back() ,但我需要了解为什么会发生这种情况 .insert() .

帖子版权声明 1、本帖标题:使用 std::vector::insert 将字符串插入 uint8_t 向量中,将随机数据放入其中
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Staša Sekulić在本站《string》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 因为 getVal 按值返回,所以两次调用将返回两个不同且不相关的 std::string 对象。

    begin end 将与不同的对象相关,将它们一起使用将导致 未定义的行为 .

    您要么需要创建一个静态字符串并返回对它的引用。要么您需要存储 getVal 返回的字符串并使用该对象。

  • 这是因为你调用 begin() end() 返回一个临时的迭代器(基本上是一个指向底层数组的指针)。你 std::string 从函数中 getVal .
    你可以通过以下方法修复该问题:

    std::string getVal() {
      std::string x = "564";
      return x; // note: Simpler is 'return "564";'
    }
    
    int main() {
      std::vector<uint8_t> data { 'p' };
      auto val = getVal(); // OK: Copy of the string.
      data.insert(data.end(), val.begin(), val.end());
    }
    
  • ufo 2月前 0 只看Ta
    引用 4

    我正在使用以下代码更新文档,但出现未知错误。我搜索了互联网,但没有找到此错误的任何解释。final db = FirebaseFirestore.instance;String

    我正在使用以下代码更新文档,但出现未知错误。我搜索了整个互联网,但没有找到此错误的任何解释。

    final db = FirebaseFirestore.instance;
    String pdtRefId;
    await db
        .collection('product')
        .where('pid', isEqualTo: pid)
        .get()
        .then((QuerySnapshot<Map<String, dynamic>> value) async {
      print('\nSuccessfully retrieved ordered product');
      pdtRefId = value.docs.first.id;
      
      print('\npdtRefId = $pdtRefId');
    
      if (pdtRefId.isNotEmpty) {
        try {
          print('Condition met to update, trying now!'); // --> PRINT STATEMENTS IN CONSOLE TILL HERE
          await db.collection('product').doc(pdtRefId).update({"inProd": inProd}); // --> CODE STUCKS HERE
    
          print('\nUpdate done!!!');
    
          ref.invalidate(
              FetchProductsProvider(productId: null, clientId: null, inProd: true));
          print('\nInvalidated product provider with inProd: true, awaiting updated view');
          await future;
        } on FirebaseException catch (error) {
          Utils.showSnackBar(error.message);
        }
      }
    });
    

    当我 await db.collection('product').doc(pdtRefId).update({"inProd": inProd}); 在按钮的 onPressed 中使用硬编码值运行时,控制台中显示以下错误。

    Error
    dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 329:10  createErrorWithStack
    dart-sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart 265:28            _throw
    dart-sdk/lib/core/errors.dart 120:5                                           throwWithStackTrace
    dart-sdk/lib/async/zone.dart 1386:11                                          callback
    dart-sdk/lib/async/schedule_microtask.dart 40:11                              _microtaskLoop
    dart-sdk/lib/async/schedule_microtask.dart 49:5                               _startMicrotaskLoop
    dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 181:7            <fn>
    
  • Anne 2月前 0 只看Ta
    引用 5

    确保您没有临时字符串,并使用 std::transform 和 std::back_inserter ,如下所示:

    #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <string>
    #include <vector>
    
    std::string getVal() 
    {
        std::string x = "564";
        return x ; 
    }
    
    int main() 
    { 
        std::vector<uint8_t> data {0x70}; 
        auto string = getVal();
        std::transform(string.begin(),string.end(), std::back_inserter(data), [](const char c) { return static_cast<std::uint8_t>(c); });
    
        for (const auto i:data)
            std::cout << i << "\n";
    
        return 0; 
    }
    
  • 使用临时的应该是可以的(尽管这需要一点技巧);但使用两个不同的临时的才是问题所在。

  • @PeteBecker 我想避免上述问题 ;) 但是是的,我同意 OP 问题中的真正问题在于两个不同的问题。

返回
作者最近主题: