自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ocfbnj的博客

万丈高楼平地起

  • 博客(74)
  • 收藏
  • 关注

原创 目录

文章目录C++C++C++函数的调用约定C++代码布局C++线程池C++20:协程C是C++的子集吗?C++20:使用协程实现简易生成器C++实现字符串与数值转换解决vs使用std::cin.sync()无法清空输入缓冲区

2020-11-06 16:54:27 245

原创 密码学入门(8):密钥和随机数

DH密钥交换、KDF、字典攻击、线性同余法

2022-02-12 20:22:56 5692

原创 密码学入门(7):数字签名和证书

数字签名、数字证书

2022-02-10 20:09:44 6118 1

原创 密码学入门(6):消息认证码

MAC、HMAC、AEAD、重放攻击

2022-02-09 22:18:13 9757 4

原创 密码学入门(5):单向散列函数

MD5、SHA-256、雪崩效应、生日攻击

2022-02-08 19:56:08 2472

原创 密码学入门(4):公钥密码

密钥配送问题、RSA公钥密码系统、中间人攻击、混合密码系统

2022-02-07 21:34:14 4277

原创 密码学入门(3):分组密码的模式

ECB、CBC、CFB、OFB、CTR

2022-02-06 15:06:28 1956

原创 密码学入门(2):对称密码

凯撒密码、简单替换密码、一次性密码本、DES、3DES、AES

2022-02-05 22:32:00 3250

原创 密码学入门(1):基本概念

密码学基本概念

2022-02-05 00:53:33 1808 3

翻译 C++20 协程(2):理解co_await运算符

理解co_await的工作方式可以让我们更明白协程的行为,以及协程如何被暂停和恢复。在这篇文章中,我将解释co_await运算符的机制并引入Awaitable和Awaiter。

2022-01-28 22:34:57 2628

原创 VS Code在arm架构的macOS上调试CMake项目

VS Code在arm架构的macOS上调试CMake项目VS Code有一个CMake Tools扩展,支持快速调试CMake项目,但在arm架构的macOS上无法启动调调试目标,如下图所示:下面是解决方法:安装CodeLLDB扩展添加一个LLDB调试配置添加后会自动打开.launch.json,修改文件内容如下(你可以直接复制粘贴,不需要做任何修改):{ // Use IntelliSense to learn about possible attributes

2021-12-28 13:50:46 1071

原创 Windows下std::this_thread:sleep_for()休眠精度问题

Windows下std::this_thread:sleep_for()休眠精度问题最近在开发一个NES模拟器,想自己实现一个简单的像素游戏引擎用来渲染NES输出的图像。NES系统能输出60帧的图像,所以我希望游戏引擎能将帧率限制在60帧。最简单的方法就是用sleep控制每次主循环的时间。但同样的代码,在Mac OS和Windows上出现了不同的结果。在Mac OS上,程序运行符合预期,可以稳定输出60帧,但在Windows上,程序运行变得非常慢,大概30多帧左右。经过几天的研究,发现是Windows下

2021-12-27 15:04:27 3904

原创 游戏的主循环中能使用sleep吗?

游戏的主循环中能使用sleep吗?先说结论,可以用sleep控制帧率,并且SFML库就是这么做的。控制游戏的帧率是一个常见的问题,比如我们想让游戏运行在60帧。因为过高的帧率不会对游戏体验有太大的影响,反而会更占用计算机的资源,增加计算机的功耗。在CPU的运行速度已经达到60帧的要求时,我们希望通过sleep,让操作系统将CPU分配给其他进程。除此之外,如果不控制帧率,因为游戏逻辑的变化,可能导致每帧的时间不一样,从而影响游戏体验。但实际在控制帧率时,不一定要用sleep,也可以在游戏的逻辑中控制帧

2021-12-27 14:37:42 2167

原创 使用C++开发的NES(FC)模拟器

It is exciting!

2021-12-24 17:28:39 2001

原创 Asio源码分析(3):使用epoll实现Proactor模式(1)

使用epoll实现Proactor模式(1)文章目录使用epoll实现Proactor模式(1)Proactor设计模式使用Reactor模拟ProactorAsio函数调用过程参考下面是一段Asio中典型的代码(忽略错误处理和tcp消息边界相关问题):#include <iostream>#include "asio.hpp"char read_buf[4096];int main() { asio::io_context ctx; asio::ip::tcp

2021-08-02 21:25:14 1147

原创 Asio源码分析(2):Asio用到的C++技巧和优化

Asio源码分析(2):Asio用到的C++技巧和优化文章目录Asio源码分析(2):Asio用到的C++技巧和优化使用析构函数执行清理操作使用模板元编程模拟概念使用对象池避免对象频繁地创建和销毁使用函数指针和继承实现多态使用继承共享数据而不是实现多态(虚函数)参考Asio中用到了一些C++技巧和优化,第一次阅读源码时可能会有一些困惑(confuse)。这篇文章先简单介绍其中的一小部分,方便后面的分析。使用析构函数执行清理操作Asio使用对象的析构函数在作用域结束时执行一些清理操作,有点类似于Go语

2021-07-27 11:09:22 1349

原创 Asio源码分析(1):概述

Asio源码分析(1):概述文章目录Asio源码分析(1):概述Proactor和Reactor设计模式参考Asio是一个跨平台的C++网络库,目前它的一部分已经成为了C++ Networking TS(C++ Technical specifications),并有望加入到C++23。从Asio将并入标准库这一点来看,它应该是一个不错的网络库,有一定的学习价值。这是Asio源码分析系类文章的第一篇,这个系列要解决的问题主要有:Asio的源码用到了哪些C++技巧,做了哪些优化?在Linux下,A

2021-07-26 11:27:20 1705

原创 CMake教程

CMake教程CMake是一个构建系统,可以用于构建跨平台的C和C++项目。其它的构建系统有makefile、MSBuild以及qmake。使用CMake作为C或C++的构建系统已经变得越来越流行了,例如:在Jetbrains的C++ 编程 - 2020 开发人员生态系统信息图调查中,CMake是最流行的构建系统。CMake是CLion的默认构建系统。CMake是Qt6的默认构建系统,之前是qmake。Visual Studio IDE将对CMake的支持添加到2020年规划的路线图中。许多

2021-01-20 23:08:48 22021 9

原创 Linux下的进程间通信

Linux下的进程间通信文章目录Linux下的进程间通信引入管道FIFO与管道的区别POSIX共享内存System V IPC消息队列共享内存与POSIX共享内存的区别缺点套接字网络套接字字节流套接字数据报套接字UNIX域套接字与网络套接字的区别不同IPC的比较总结参考引入进程间通信(Inter-Process Communication)是指两个进程间传递数据的方法。在Linux下常见的有管道、FIFO、POSIX定义的共享内存,信号量和消息队列、System V定义的共享内存,信号量和消息队列,以

2020-12-21 21:03:58 262

原创 C程序的内存布局

C程序的内存布局理解C程序的内存布局非常重要。这篇文章将说明C程序的内存布局,并通过一些工具和程序来验证它们。内存布局是与平台相关的,这篇文章的测试的环境为:Ubuntu 20.04 64位gcc version 9.3.0文章目录C程序的内存布局预备知识典型的C程序内存布局1. 文本段2. 初始化的数据段3. 未初始化的数据段4. 堆5. 栈验证简单的测试程序通过objdump验证参考预备知识在开始之前,需要了解objdump工具的基本使用,如果你已经非常熟悉它们,请跳过这部分。我们将

2020-11-24 19:13:00 415

原创 C和C++实现可变参数函数

C和C++实现可变参数函数C语言中的printf相关的函数,C++中的emplace相关的函数都使用了变参函数。这篇文章将简单介绍C和C++的不同实现方式。文章目录C和C++实现可变参数函数C语言实现可变参数函数一个简单的例子va_list类型va_stat宏va_copy宏va_end宏va_arg宏C++实现可变参数函数通过std::initializer_list实现变参函数一个简单的例子类模板std::initializer_list通过参数包实现变参函数基础知识一个简单的例子使用折叠表达式简化

2020-11-22 12:30:12 384

原创 gcd和lcm算法

gcd和lcm算法gcd(greatest common divisor)为最大公约数,lcm(least common multiple)为最小公倍数。gcd算法下面的算法是欧几里得算法(Euclidean algorithm),也叫辗转相除法。int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b);}lcm算法两个整数的最小公倍数与最大公因数之间有如下的关系:

2020-11-11 19:57:21 8519

原创 基本的套接字函数

基本的套接字函数文章目录基本的套接字函数socket函数概要domain参数type参数protocol参数返回值domain和type常见的组合对比AF_XXX和PF_XXX(地址族和协议族)bind函数概要addr和addrlen参数返回值connect函数概要addr和addrlen参数返回值listen函数概要backlog参数返回值accept函数概要addr和addrlen参数返回值close函数概要fd参数返回值描述符引用计数shutdown函数概要how参数返回值参考socket函数概

2020-11-06 19:44:42 381

原创 inet_pton和inet_ntop函数

inet_pton和inet_ntop函数文章目录inet_pton和inet_ntop函数inet_ptoninet_ntop例子参考inet_pton和inet_ntop是两个新函数,它用来代替inet_aton、inet_addr和inet_ntoa函数。inet_pton和inet_ntop适用于IPv4和IPv6地址。inet_pton#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst

2020-11-05 22:55:33 1039

原创 套接字地址结构

套接字地址结构文章目录套接字地址结构IPv4套接字地址结构通用套接字地址结构IPv6套接字地址结构新的通用套接字地址结构套接字地址结构的比较参考大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议族都定义了它自己的套接字地址结构。这些结构的名字均以sockaddr_开头,并以对应于每个协议族的唯一后缀结尾。IPv4套接字地址结构IPv4套接字地址结构以sockaddr_in命名,定义在头文件<netinet/in.h>中。下面是Linux下的定义(已简化):struct

2020-11-05 13:05:46 433

原创 C++函数的调用约定

C++函数的调用约定文章目录C++函数的调用约定引入常见的调用约定__cdecl__stdcall__fastcall参考引入调用约定允许你指定被调函数和调用者之间传递参数和返回值的方式。不同的调用约定区别主要在于:参数和返回值放置的位置。参数传递的顺序。调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配。并非所有约定都在所有支持的平台上可用,某些约定使用平台特定的实现。这篇文章描述的是x86平台。在 x86 平台上,所有参数在传递时都将加宽到 32 位。 返回值也将加宽到 3

2020-10-28 14:34:23 569

原创 TCP连接的建立和中止

TCP连接的建立和中止文章目录TCP连接的建立和中止TCP连接的建立TCP连接的中止TCP状态转换图观察分组TIME_WAIT状态参考理解TCP连接的建立和中止,有助于我们理解connect、accept和close这3个函数。TCP连接的建立服务器准备好接受外来的连接。这通常通过调用socket、bind和listen这3个函数来完成,我们称之为被动打开(passive open)。客户通过connect发起主动打开(active open)。这导致TCP客户发送一个SYN分节,它告诉服务器客

2020-10-26 12:55:46 414

原创 Linux系统引导过程

Linux系统引导过程理解引导过程可以帮助你解决引导系统时遇到的问题。引导过程涉及一些文件,这些文件中的错误通常造成了引导问题。引导过程和配置是不同的,这取决于你的硬件是使用UEFI固件还是传统的BIOS去处理系统引导。该文章描述的操作系统为Oracle Linux 8。UEFI引导在一个基于UEFI的系统中,系统引导过程按如下顺序执行:系统的UEFI固件执行开机自检(POST),然后定位和初始化外围设备,包括硬盘。UEFI查找一个带有特定的全局唯一标识符(GUID)的GPT分区,标识符

2020-10-22 22:51:28 257

原创 C++代码布局

C++代码布局问题一致的布局是很有用的,C++对代码的布局没有严格要求,这导致了许多C++代码都有不一样的布局风格,阅读起来很不方便。在我们周围存在许多不同风格的代码布局,人们赞同或反对它。实际的项目可能包含了许多不同来源的代码,因此,统一代码的布局通常是不可能的。但是,在你不知道使用或不被要求使用某种布局时,使用一种统一的布局是明智的做法。我们可以通过IDE或一些工具来格式化我们的代码,例如Visual Studio IDE和clang-format工具。C++核心指南(C++之父参与编写)提供

2020-10-09 14:16:19 401

原创 C++线程池

C++线程池文章目录C++线程池介绍使用C++实现线程池1. 查看系统支持的最大线程数量2. 线程池的方法和数据结构3. 线程池的构造函数4. 无限循环的函数5. 线程池的析构函数6. start函数测试参考资料C++线程池的简单实现。完整代码:https://github.com/ocfBNj/ThreadPool介绍线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免

2020-10-07 17:14:24 747 1

原创 使用CocosCreator开发的FC坦克大战

游戏预览:https://tank.ocfbnj.cnApp下载:https://app.ocfbnj.cnGitHub仓库:https://github.com/ocfBNj/CocosCreatorTank除了道具和双人游戏没有完成,其他功能基本与原版游戏相同。因为Cocos Creator是跨平台的游戏开发工具,因此该游戏可以运行在Web、IOS、Android、Windows、Mac以及各个小游戏平台。下面是一些运行截图:...

2020-10-05 16:10:06 1241 2

原创 稀疏表

文章目录稀疏表构造稀疏表查询范围最小值洛谷P3865 ST表稀疏表学习稀疏表:https://www.youtube.com/watch?v=c5O7E_PDO4U稀疏表(Sparse Table),也叫ST表,用来解决范围最值查询(Range Minimum Query)问题。假设有一个数组,我们需要对该数组执行如下操作(以下全部假设数组下标从0开始):求一个区间[low,high][low,high][low,high]内的最大值不同的解决方法所花的时间不同:解决方法预处理时

2020-10-05 15:00:06 954

原创 使用VS Code进行Qt开发

使用VS Code进行Qt开发Qt Creator界面不美观,而VS Code更漂亮一些。因为Qt5支持使用CMake进行构建,而VS Code也可以支持CMake构建系统,因此是完全可以的。测试环境Qt 5.15.0CMake 3.17.5Visual Studio 2019 16.7.5(使用C++的桌面开发)Visual Studio Code 1.49.3步骤1. 将Qt的bin目录添加到环境变量假设Qt安装在C:\Qt,那么将C:\Qt\5.15.0\msvc2019_64

2020-10-04 19:47:05 65894 43

原创 线段树

文章目录线段树构造线段树使用普通方式求范围和懒惰传播(lazy propagation)使用懒惰传播的方式更新范围值使用懒惰传播的方式求范围和洛谷P3372 线段树1线段树学习线段树(segment tree):https://www.youtube.com/watch?v=ZBHKZF5w4YU学习线段树的懒惰传播(lazy propagation):https://www.youtube.com/watch?v=xuoQdt5pHj0首先简单介绍一下什么是线段树,以及为什么要使用线段树。假设有

2020-10-04 13:10:50 277

原创 洛谷P3368 树状数组2

文章目录洛谷P3368 树状数组2题目链接树状数组差分数组解决洛谷P3368 树状数组2题目链接https://www.luogu.com.cn/problem/P3368树状数组学习树状数组:https://www.youtube.com/watch?v=v_wj_mOAlig首先简单介绍一下树状数组,以及为什么要使用树状数组。假设有一个数组,我们需要对该数组执行如下操作(以下全部假设数组下标从1开始):求前i项的和。将第i项元素加上某个给定的值。如果使用普通的数组,执行第一个操作

2020-10-03 20:15:14 289

翻译 C++20 协程(1):协程理论

这是C++ Coroutines TS系列文章的第一篇,Coroutines是一种新的语言特性,目前已经纳入C++20语言标准。

2020-10-01 16:38:09 2306

原创 如何编写Go代码

文章目录如何编写Go代码引入代码组织你的第一个程序从你的模块导入包从远程模块导入包测试参考资料如何编写Go代码引入这篇文章演示了在一个模块内如何去开发一个简单的Go包,并且引入了go工具,他是用于获取,构建和安装Go模块,包和命令的标准方式。注意:这篇文章假定你正在使用Go1.13及之后的版本,并且GO111MODULE环境变量没有被设置。代码组织Go程序被组织为包。一个包是源文件的集合,这些源文件在同一个目录并且被一起编译。被定义在一个源文件中的函数,类型,变量和常量,对于相同包之内的其他源文

2020-08-20 13:57:43 396

原创 Go语言new和make的区别

new vs makeGo有两种分配原语,分别为new和make。他们做的事情不同,并且处理不同的类型,这看上去让人感到困惑,但是规则相当简单。newnew是一个用来分配内存的内置函数(C++中是运算符),但他和大多数其他语言不同,new不会初始化内存(C++中会分配并调用构造函数),而是将内存归0(也就是初始化成0)。即,new(T)给类型T分配了一个存储了0值的内存并且返回它的地址(在C++中相当于先调用malloc分配内存,然后调用memset初始化内存),返回的类型为**T*。用Go的术语来说

2020-08-20 12:27:27 1357

原创 使用Certbot申请免费泛域名SSL证书

文章目录使用certbot申请免费泛域名SSL证书测试环境预备需求详细步骤将证书配置到服务器使用certbot申请免费泛域名SSL证书测试环境Ubuntu Server 20.04阿里云域名cerbot版本1.7.0其他环境请参考cerbot指南https://certbot.eff.org/instructions预备需求域名root权限详细步骤登录到服务器安装snapd(ubuntu 20.04已经默认安装,如果没安装请参考https://snapcraft.io

2020-08-15 13:08:19 1716

原创 Ubuntu20.04使用nmcli配置网络连接

文章目录Ubuntu Server 20.04使用nmcli配置网络连接预备需求步骤例子:使用nmcli配置静态ip地址相关资料Ubuntu Server 20.04使用nmcli配置网络连接预备需求Ubuntu Server 20.04root权限可以访问互联网步骤安装network-managersudo apt install network-manager使用ip addr查看要配置的网卡cc@ubuntu:~$ ip addr1: lo: <LOOPBAC

2020-08-09 13:55:18 11670

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除