Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C++中将字节字符串拆分为字节向量

在C++中将字节字符串拆分为字节向量
EN

Stack Overflow用户
提问于 2014-07-24 07:57:26
回答 3查看 1.8K关注 0票数 5

我有一个字节字符串,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"1,3,8,b,e,ff,10"

如何将此字符串拆分为包含以下值的std::字节向量:

0x01,0x03,0x08,0x0b,0x0e,0xff,0x10

我正在尝试使用',‘分隔符来拆分字符串,但是要让它工作起来有点困难。有人能帮我一下如何完成这个任务吗?

所以我试过这个:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    std::istringstream iss("1 3 8 b e ff 10");
    BYTE num = 0;
    while(iss >> num || !iss.eof()) 
    {
        if(iss.fail()) 
        {
            iss.clear();
            std::string dummy;
            iss >> dummy;
            continue;
        }
        dataValues.push_back(num);
    }

但这会将ascii字节值推到向量中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
49 //1
51 //3
56 //8
98 //b
101 //e
102 //f
102 //f
49 //1
48 //0

相反,我试图用以下内容填充向量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0x01
 0x03
 0x08
 0x0b
 0x0e
 0xff
 0x10
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-24 11:54:20

在我的评论中,您只是为了适应链接答案用例中出现的一些小问题而错过了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    std::istringstream iss("1,3,8,b,e,ff,10");
    std::vector<BYTE> dataValues;

    unsigned int num = 0; // read an unsigned int in 1st place
                          // BYTE is just a typedef for unsigned char
    while(iss >> std::hex >> num || !iss.eof()) {
        if(iss.fail()) {
            iss.clear();
            char dummy;
            iss >> dummy; // use char as dummy if no whitespaces 
                          // may occur as delimiters
            continue;
        }
        if(num <= 0xff) {
            dataValues.push_back(static_cast<BYTE>(num));
        }
        else {
            // Error single byte value expected
        }
    }

您可以看到完全工作的示例就在这里

票数 1
EN

Stack Overflow用户

发布于 2014-07-24 09:13:34

工作样例代码(用C++11在GCC 4.9.0中测试):

文件save.txt包含:1,3,8,b,e,ff,10作为第一个和唯一的行。

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1
3
8
b
e
ff
10

这样做的目的是:

  • 使用std::getline逐行读取。
  • 使用boost:: split 根据分隔符拆分行。
  • 用户std::stringstream将从十六进制字符串转换为无符号字符。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <fstream>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/lexical_cast.hpp>

int main(int argc, char* argv[]) {
    std::ifstream ifs("e:\\save.txt");

    std::string line;
    std::vector<std::string> tokens;
    std::getline(ifs, line);
    boost::split(tokens, line, boost::is_any_of(","));

    std::vector<unsigned char> values;
    for (const auto& t : tokens) {
        unsigned int x;
        std::stringstream ss;
        ss << std::hex << t;
        ss >> x;

        values.push_back(x);
    }

    for (auto v : values) {
        std::cout << std::hex << (unsigned long)v << std::endl;
    }

    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2014-07-24 10:12:23

为了演示另一种可能更快的处理方法,可以考虑将所有内容读入数组并使用自定义迭代器进行转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ToHexIterator : public std::iterator<std::input_iterator_tag, int>{
    char* it_;
    char* end_;
    int current_;
    bool isHex(const char c){
        return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');
    }
    char toUpperCase(const char c){
        if (c >= 'a' && c <= 'f'){
            return (c - 'a') + 'A';
        }
        return c;
    }
    int toNibble(const char c){
        auto x = toUpperCase(c);
        if (x >= '0' && x <= '9'){
            return x - '0';
        }
        else {
            return (x - 'A') + 10;
        }
    }
public:
    ToHexIterator() :it_{ nullptr }, end_{ nullptr }, current_{}{}                  //default constructed means end iterator
    ToHexIterator(char* begin, char* end) :it_{ begin }, end_{ end }, current_{}{
        while (!isHex(*it_) && it_ != end_){ ++it_; };  //make sure we are pointing to valid stuff
        ++(*this);
    }
    bool operator==(const ToHexIterator &other){
        return it_ == nullptr && end_ == nullptr && other.it_ == nullptr && other.end_ == nullptr;
    }
    bool operator!=(const ToHexIterator &other){
        return !(*this == other);
    }
    int operator*(){
        return current_;
    }
    ToHexIterator & operator++(){
        current_ = 0;
        if (it_ != end_) {
            while (isHex(*it_) && it_ != end_){
                current_ <<= 4;
                current_ += toNibble(*it_);
                ++it_;
            };
            while (!isHex(*it_) && it_ != end_){ ++it_; };
        }
        else {
            it_ = nullptr;
            end_ = nullptr;
        }
        return *this;
    }
    ToHexIterator operator++(int){
        ToHexIterator temp(*this);
        ++(*this);
        return temp;
    }
};

基本用例如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
char in[] = "1,3,8,b,e,ff,10,--";
std::vector<int> v;
std::copy(ToHexIterator{ std::begin(in), std::end(in) }, ToHexIterator{}, std::back_inserter(v));

请注意,使用查找表执行ascii到十六进制的小转换可能更快。

速度可能非常依赖于编译器优化和平台,但是,由于一些istringstream函数是作为虚拟化或指向函数的指针(取决于标准库实现)实现的,因此优化器对它们有困难。在我的代码中,没有辅助项或函数指针,惟一的循环在std::copy实现中,优化器用来处理这些实现。通常情况下,循环速度更快,直到两个地址相等,而不是循环,直到某个变化的指针指向的事物等于某物为止。最后,所有的猜测和伏都教,但在我的机器上的MSVC13上,我的速度大约快了10倍。下面是GCC的一个活生生的例子,它在10x到3x之间,取决于运行,取决于哪个测试首先进行(可能是因为一些缓存效果)。

总之,毫无疑问还有更多的优化空间等,任何在这个抽象级别上说“我的速度总是更快”的人都在卖蛇油。

更新:使用编译时间生成的查找表将进一步提高速度:http://ideone.com/ady8GY (请注意,我增加了输入字符串的大小以减少噪声,因此这与上面的示例不直接比较)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24938606

复制
相关文章
undefined vs null
许多编程语言都有一个空值(non-value)null:表示存在一个变量但是没有指向一个对象。
前端柒八九
2022/08/25
1.1K0
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
12.4K0
JS中判断null、undefined与NaN的方法
写了个 str ="s"++;  然后出现Nan,找了一会。  收集资料如下判断: 1.判断undefined: 1 2 3 4 var tmp = undefined; if (typeof(tmp) == "undefined"){ alert("undefined"); } 说明:typeof 返回的是字符串,有六种可能:"number"、"string"、"boolean"、"object"、"function"、"undefined"  2.判
庞小明
2018/03/08
5.7K0
主外键关联删除(on delete set null和on delete cascade)
主外键关联,当删除的是父表数据,参照这些要删除的数据,Oracle有三种处理方式:
bisal
2019/01/29
2.9K0
如何删除对象的某个属性(对象属性方法是什么)
const object = { ‘a’: 1, ‘b’: ‘2’, ‘c’: 3 };
全栈程序员站长
2022/07/29
4.5K0
null == undefined ?
最近在看《JavaScript高级程序设计》一书,书中讲到相等操作符(==)时说,要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == undefined 会返回 true 。的确,在ECMAScript规范中也是这样定义的,但我认为这样来理解这件事情,似乎有些浮于表面,网上也有很多关于这个问题的文章,下面我希望从一个全新的角度来分析 null 和 undefined 的区别,从而理解两者为何会相等:
疯狂的技术宅
2019/03/28
2.5K0
null == undefined ?
Javascript中null和undefined的区别?
null:空值,一般主动赋值才会出现。表示主观上这个变量的值就是空的,比如你去获取蒙奇 D 鸣人的资料,这人不存在,那么返回的值就应该是 null。
IT工作者
2022/01/15
5090
Javascript 中 null和undefined的区别
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
wfaceboss
2019/04/08
7820
JavaScript中undefined与null详解
对于undefined和null我一直知道他们有很多区别,也知道一点关于他们的区别,但却不具体系统,因此总结了一下,主要心得如下:
Javanx
2019/09/04
7700
JavaScript中undefined与null详解
JS中Null与Undefined的区别
Undefined类型只有一个值,即undefined。当声明的变量还未被初始化时,变量的默认值为undefined。 Null类型也只有一个值,即null。null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。 Screenshot (12).png js 代码 var oValue; alert(oValue == undefined); //output "true" 这段代码显示为true,代表oVlaue的值即为undefined,因为我们没有初始化它。 js 代码 a
前朝楚水
2018/04/02
3.6K0
JS中Null与Undefined的区别
Typescript中undefined与null的区别
ts配置文件中有个选项 "strictNullChecks" 如果设置值为false,那么以下代码都不是问题 ,如果设置为true, 以下代码可以说明undefined和null在ts中的区别
lilugirl
2020/06/28
3.3K0
null 和 undefined
浏览器会弹出窗口显示 undefined。因为对于使用了 var 声明但没有进行初始化定义的变量, 其值默认为 undefined。
Chor
2019/11/08
1.8K0
JavaScript中的null和undefined的区别
1、null 表示没有对象,即该处不应该有值,用法如下: 作为函数的参数,表示该函数的参数不是对象; 作为原型链的终点。 2、undefined 表示缺少值,就是此处应该有一个值,但是还没有定义,情况如下: 变量被声明了,但没有赋值时,就等于undefined; 调用函数时,应该提供的参数没有提供,该参数等于undefined; 对象没有赋值的属性,该属性的值为undefined; 函数没有返回值的时,默认返回undefined;
IT工作者
2021/12/31
7730
python中面向对象VS面向过程
面向过程编程:首先分析出解决问题所需要的步骤(即“第一步做什么,第二步做什么,第三步做什么”),然后用函数实现各个步骤,再依次调用。
全栈程序员站长
2022/09/07
4360
python中面向对象VS面向过程
vs中没有vc_vs中的控件
头文件fstream包含了ifstream、ofstream、fstream三个类,可以通过定义这三个类的对象来实现相对应的文件操作。
全栈程序员站长
2022/09/30
7630
【基础】JavaScript 中 null 和 undefined 的区别?
通过运行代码可以看出null和undefined是相等的,但是当他们做全等比较时,又不等。原因是什么呢?我们再来看下他们的类型:
青年码农
2020/12/17
7780
探索JavaScript中Null和Undefined的深渊
在讨论JavaScript中的原始数据类型时,大多数人都了解基本知识,从String,Number和Boolean开始。这些原语非常简单,可以像您期望的那样起作用。但是,本文将重点介绍称为Null和Undefined的更独特的原始数据类型。是什么使它们相似,不相似以及总体上与众不同。
公众号---人生代码
2021/02/24
7250
vue删除对象的某个属性(js怎么删除对象中的某个元素)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128065.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/26
10.3K0
null 和 undefined 的区别!
许多编程语言都有一个称为null的非值。它指示一个变量当前不指向一个对象,例如,当它还没有初始化的时候。
前端小智@大迁世界
2022/03/22
1.1K0
null和undefined的区别
在Js中null与undefined是两种基本数据类型,都可以用来表示"无"这个概念,但是在语义表达以及实际使用上是有所区别的。
WindRunnerMax
2020/08/27
2.5K0

相似问题

c++中的delete vs NULL vs free

60

删除vs delete[]

49

批量删除(truncate vs delete)

61

new char [] vs new char(),delete() vs delete []

10

正确使用C++中关于char *的delete vs delete[ ]

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文