<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[技术之道，其路之久远，需淡然与仔细]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/robert8803</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; robert8803]]></copyright><item><title><![CDATA[Python CRC8 实现]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/128865473</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/128865473</guid><author>robert8803</author><pubDate>Fri, 03 Feb 2023 14:34:20 +0800</pubDate><description><![CDATA[python语言的CRC-8实现]]></description><category></category></item><item><title><![CDATA[Java使用BouncyCastle进行基于ECDSA算法的椭圆曲线secp256r1证书自签名]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/126659611</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/126659611</guid><author>robert8803</author><pubDate>Fri, 02 Sep 2022 13:43:12 +0800</pubDate><description><![CDATA[Java使用BouncyCastle库，基于secp256r1曲线椭圆曲线，根据ECDSA密钥算法生成密钥对，并使用SHA256签名算法进行自签名。构建适用于ISO15118等要求密钥套件。]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：运行时类型信息]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124696836</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124696836</guid><author>robert8803</author><pubDate>Tue, 10 May 2022 20:58:03 +0800</pubDate><description><![CDATA[1、运算符dynamic_cast接受两个对象：被&lt;和&gt;包围的一个类型和被(和)包围的一个指针或引用。

dynamic_cast&lt;T*&gt;(p)

如果p是T*类型，或者是D*类型且T是D的基类，则得到的结果就如同我们简单地将p赋予一个T*一样。

2、当用dynamic_cast转换指针类型时，nullptr表示转换错误。如果dynamic_cast转换的引用对象不是所期望的类型，它会抛出一个bad_cast异常。

3、static_cast不检查要转换的对象，而对于void*所]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：派生类]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124438926</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124438926</guid><author>robert8803</author><pubDate>Tue, 26 Apr 2022 22:59:42 +0800</pubDate><description><![CDATA[1、派生类继承了来自基类的属性，因此这种关系称为继承。有时基类也称为超类，派生类也成称为子类。


//基类Employee
struct Employee{
    string first_name, family_name;
    char middle_initial;
    Date hiring_date;
    short department;
    //...
};
//派生类Manager
struct Manager: public Employee{
    list&lt;]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：特殊运算符]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124393334</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124393334</guid><author>robert8803</author><pubDate>Sun, 24 Apr 2022 22:25:44 +0800</pubDate><description><![CDATA[1、运算符[]，作为取下标运算符。我们可以用operator[]函数为类对象的下标赋予某种新的含义。operator[]函数的第2个参数（下标）可以是任意类型的，因此，它常被用于定义vector、关联数组等类型。

2、运算符()，作为函数调用运算符。operator()函数的参数列表按照常规的参数传递规则进行求值和检查。

3、运算符-&gt;，作为解引用运算符。

4、运算符++和--，作为递增和递减运算符。

5、运算符new和delete，作为分配和释放运算符。

6、运算符""，作为用户自定义字面]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：运算符重载]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124371124</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124371124</guid><author>robert8803</author><pubDate>Sat, 23 Apr 2022 22:37:20 +0800</pubDate><description><![CDATA[1、程序员用complex::operator+()和complex::operator*()分别表示+和*的含义。当b和c的类型是complex时，b+c等价于b.operator+(c)。

2、对于任意一种二元运算符@，aa@bb可以理解成aa.operator@(bb)或者operator@(aa,bb)。对于任意一元后置运算符@，aa@可以理解成aa.operator@(int)或者operator@(aa,int)。

3、考虑二元运算符@的情况。假设x的类型是X，y的类型是Y，则x@y的解析过]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：构造、清理、拷贝和移动]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124215703</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124215703</guid><author>robert8803</author><pubDate>Sat, 16 Apr 2022 17:01:55 +0800</pubDate><description><![CDATA[1、移动和拷贝的区别在于，拷贝操作后两个对象具有相同的值，而移动操作后移动源不一定具有其原始值。如果源对象在操作后不再使用，我们就可以使用移动操作。

2、与类同名的成员称为构造函数，构造函数的声明指出其参数列表，但未指出返回类型。构造函数的任务时初始化该类的一个对象。


class Vector{
public:
    Vector(int s);
    //...
};

3、析构函数保证在对象销毁时会被调用，它的名字是~后接类名，例如：~Vector()。析构函数一般进行清理工作并释放资源。

]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：类]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124160008</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124160008</guid><author>robert8803</author><pubDate>Wed, 13 Apr 2022 23:27:00 +0800</pubDate><description><![CDATA[1、类的简要概括如下：

一个类就是一个用户自定义类型。
	一个类由一组成员构成。最常见的成员类别是数据成员和成员函数。
	成员函数可定义初始化（创建）、拷贝、移动和清理（析构）等语义。
	对对象使用.（点）访问成员，对指针使用-&gt;（箭头）访问成员。
	可以为类定义运算符，如+、！和[]。
	一个类就是一个包含其成员的名字空间。
	public成员提供类的接口，private成员提供实现细节。
	struct是成员默认为public的类。

class X{
private:             ]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：源文件与程序]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124088112</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124088112</guid><author>robert8803</author><pubDate>Sun, 10 Apr 2022 23:33:45 +0800</pubDate><description><![CDATA[1、除非已显式声明为局部名字，否则函数名、类名、模板名、变量名、名字空间名、枚举名以及枚举值名的使用必须跨所有编译单元保持一致。

2、如果全局作用域中或名字空间中的变量定义不带初始值，则该变量会使用默认初始值。非static局部变量或创建在自由存储上的对象则不会使用默认初始值。

3、关键字static及关键字const、constexpr暗示默认使用内部链接，如果希望具有外部链接，就需要在其定义前加上extern。

4、inline函数在其应用的所有编译单元中都必须有完全等价的定义。为了确保一致性，应]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：名字空间]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/124026916</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/124026916</guid><author>robert8803</author><pubDate>Thu, 07 Apr 2022 22:52:01 +0800</pubDate><description><![CDATA[1、名字空间（namespace）的概念用来直接表示本属一体的一组特性，例如库代码。名字空间的成员都位于相同的作用域中，无需特殊符号即可相互访问，而从名字空间外访问它们就需要显式符号。

2、显式限定：我们可以在名字空间的定义中声明一个成员，稍后用“名字空间名::成员名”的语法定义它。


namespace Parser{
    double expr(bool);        //声明
    double term(bool);
    double prim(bool);
}

double v]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：异常处理]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123907808</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123907808</guid><author>robert8803</author><pubDate>Fri, 01 Apr 2022 21:34:00 +0800</pubDate><description><![CDATA[1、异常（exception）的概念可以帮助我们将信息从检测到错误的地方传递到处理该错误的地方。如果函数无法处理某个问题，则抛出（throw）异常。并且寄希望于函数的调用者能直接或者间接地处理该问题。函数如果希望处理某个问题，可以捕获（catch）相应的异常。

2、一个结构完整的异常处理机制范例：


void taskmaster()
{
    try{
        auto result = do_task();
        //使用result
    }
    catch(Some_e]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：函数]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123784387</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123784387</guid><author>robert8803</author><pubDate>Mon, 28 Mar 2022 00:26:52 +0800</pubDate><description><![CDATA[1、函数声明负责指定函数的名字、返回值（如果有的话）的类型以及调用该函数所需的参数数量和类型。

2、函数声明包含多种限定及修饰符，如下：

函数的名字，必选。
	参数列表，可以为空()，必选。
	返回类型，可以是void，可以是前置或者后置形式（使用auto），必选。
	inline，表示内联函数体实现函数调用。
	constexpr，表示当给定常量表达式作为实参时，应该可以在编译时对函数求值。
	noexcept，表示该函数不允许抛出异常。
	链接说明，例如static。
	[[noreturn]]，表]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：选择适当的操作]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123673462</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123673462</guid><author>robert8803</author><pubDate>Tue, 22 Mar 2022 22:51:22 +0800</pubDate><description><![CDATA[1、逻辑运算符与（&amp;&amp;）、或（||）、非（!）接受算术类型以及指针类型的运算对象，将其转换为bool类型，最后返回一个bool类型的结果。只有当逻辑上确实需要时，&amp;&amp;和||才会对其第二个实参求值。

2、位逻辑运算符与（&amp;）、或（|）、非（~）、右移（&gt;&gt;）和左移（&lt;&lt;）作用于整形对象。位逻辑运算符常用于实现一个小集合的概念。二元运算符&amp;表示求交操作，|表示求并操作，^表示异或操作，~表示求补操作。

3、在条件表达式c?e1:e2中使]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：表达式]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123624726</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123624726</guid><author>robert8803</author><pubDate>Mon, 21 Mar 2022 00:12:00 +0800</pubDate><description><![CDATA[1、程序就是以分号隔开的一段表达式序列。表达式的基本单元是数字、名字以及运算符等。

2、C++规定赋值运算符可以与下面的二元运算符一起使用：+ - * / % &amp; | ^ &lt;&lt; &gt;&gt;.

3、默认情况下，&gt;&gt;会跳过空白（即，空格、制表符、换行等），当输入操作失败时不更改ch的值。因此，ch==0代表输入过程结束。

4、默认情况下，get()不会像&gt;&gt;那样跳过空白符。

5、程序通过main()启动，之后main()被传入两个实参，分别是：argc指]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：语句]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123586041</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123586041</guid><author>robert8803</author><pubDate>Fri, 18 Mar 2022 22:50:25 +0800</pubDate><description><![CDATA[1、使用延迟局部变量定义可以将变量的作用域限定在一个较小的范围内。有个简洁的例子，我们在条件中声明变量：


if(double d = prim(true)){
    left /= d;
    break;
}

这里d的作用域从声明处开始，到条件控制的语句结束为止。假设还有else分支，与上面的if分支对应，则d在两个分支中都有效。

2、范围for语句，它使得程序员可以依次访问指定范围内的每个元素。


int sum(vector&lt;int&gt;&amp; v)
{
  ...]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：结构、联合与枚举]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123513928</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123513928</guid><author>robert8803</author><pubDate>Tue, 15 Mar 2022 22:57:13 +0800</pubDate><description><![CDATA[1、struct是任意类型元素构成的序列。


struct Address{
    const char* name;    //"Jim Dandy"
    int number;          //61
    const char* street;  //"South St"
    const char* town;    //"New Providence"
    char state[2];       //'N''J'
    const char* zip;     //"079]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：指针、数组与引用]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123435215</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123435215</guid><author>robert8803</author><pubDate>Fri, 11 Mar 2022 23:42:43 +0800</pubDate><description><![CDATA[1、在C++语言中存放及使用内存地址是通过指针和引用完成的。对于类型T来说，T*是表示“指向T的指针”的类型。

2、void* 的含义是“指向未知类型对象的指针”。除了函数指针和指向类成员的指针，指向其他任意类型对象的指针都能被赋给一个void*类型的变量。

3、字面值常量nullptr表示空指针，即不指向任何对象的指针。

4、T[size]的含义是“包含size个T类型元素的数组”。元素的索引范围是0到size-1。数组名会隐式的转换成指向数组首元素的指针。如果在自由存储上分配数组，一定要在最后一次]]></description><category></category></item><item><title><![CDATA[C++程序设计语言学习笔记：类型与声明]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123319753</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123319753</guid><author>robert8803</author><pubDate>Sun, 06 Mar 2022 23:25:22 +0800</pubDate><description><![CDATA[1、ISO C++标准，C++语言和标准库对应的ISO标准是ISO/IEC 14882:2011。在C++标准之下，很多重要的功能是依赖于实现的。还有一种行为是不确定的。

2、C++的一个具体实现可以有两种形式：宿主式（包含了C++标准和本书描述的所有标准库功能）、独立式（包含的标准库功能会少一些）。

3、C++标准用到的是基于基本源程序字符集，即ASCII字符集。

4、C++程序中的每个名字都对应一种数据类型。该类型决定了这个名字能执行哪些运算以及如何执行这些运算。

5、C++包含一套基本类型：布]]></description><category></category></item><item><title><![CDATA[C++程序设计：原理与实践读书笔记（第十六章）]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/123012200</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/123012200</guid><author>robert8803</author><pubDate>Fri, 18 Feb 2022 23:04:42 +0800</pubDate><description><![CDATA[函数对象，一种能够实现函数行为的对象。举例来说：


class Larger_than{
    int v;
public:
    Larger_than(int vv):v(vv){}                    //保存参数
    bool operator()(int x) const {return x&gt;v;}     //比较
}

通常，我们在程序中定义一个函数对象，然后在其他地方使用它，这有些令人生厌。这种情况下，我们可以用Lambda表达式。


//...
sort]]></description><category></category></item><item><title><![CDATA[C++程序设计：原理与实践读书笔记（第十五章）]]></title><link>https://blog.youkuaiyun.com/robert8803/article/details/122953872</link><guid>https://blog.youkuaiyun.com/robert8803/article/details/122953872</guid><author>robert8803</author><pubDate>Tue, 15 Feb 2022 23:20:40 +0800</pubDate><description><![CDATA[C++标准库为处理数据序列提供了一个专门的框架，称为STL。STL是（Standard Template Library）标准模板库的简称。STL是ISO C++标准库的部分，它提供了容器（例如vector、list和map）和通用算法（例如sort、find和accumulate）。因此，我们可以称vector这类对象为STL或标准库的一部分。

有时候我们需要对“大量数据”进行一些简单操作。为了达到此目的，首先用更加抽象的方式来看待我们要对数据进行的处理工作：

收集数据并装入容器。（例如vector、]]></description><category></category></item></channel></rss>