C语言的bit位控制工具FvMask

实际中经常通过bit的 0 或者 1 来控制系统状态,可能就需要个专门用来控制bit的工具类,下面就分享个。

例如:
m_dwRuleIndex = 0;
FvMask::Add(m_dwRuleIndex, _MASK_(1)); //第一个bit位置改为1
FvMask::Del(m_dwRuleIndex, _MASK_(1)); //第一个bit位置改为0
FvMask::HasAny(m_dwRuleIndex, _MASK_(1)); //判断第一个bit位置是否为1

#pragma once

namespace FvMask
{
	template<typename TFlag, typename TMask>
	bool HasAny(const TFlag flag, const TMask mask)
	{
		return ((flag&mask) != 0);
	}
	template<typename TFlag, typename TMask>
	bool HasAll(const TFlag flag, const TMask mask)
	{
		return ((flag&mask) == mask);
	}

	template<typename TFlag, typename TMask>
	void Add(TFlag& flag, const TMask mask)
	{
		flag |= mask;
	}

	template<typename TFlag, typename TMask>
	void Del(TFlag& flag, const TMask mask)
	{
		flag &= ~ mask;
	}

	template<typename TFlag, typename TMask>
	TFlag Remove(const TFlag flag, const TMask mask)
	{
		return (flag & (~ mask));
	}

	template<typename TFlag, typename TMask>
	TFlag IsAdd(const TFlag oldFlag, const TFlag newFlag, const TMask mask)
	{
		return (((oldFlag&mask) == 0) && ((newFlag&mask) != 0));
	}
	template<typename TFlag, typename TMask>
	TFlag IsDel(const TFlag oldFlag, const TFlag newFlag, const TMask mask)
	{
		return (((oldFlag&mask) != 0) && ((newFlag&mask) == 0));
	}
}
#ifndef _MASK_
#define _MASK_(flag) (0X01 << (flag))
#endif

根据两点的经纬度计算距离C

通过地球上的两点经纬度计算物理距离,单位是米

double rad(double d)
{
   return d * M_PI / 180.0;
}
/**
 * 获取距离
 * @param lon1
 * @param lat1
 * @param lon2
 * @param lat2
 * @return
 */
double distance(double lon1,double lat1,double lon2, double lat2)
{
   double radLat1 = rad(lat1);
   double radLat2 = rad(lat2);
   double a = radLat1 - radLat2;
   double b = rad(lon1) - rad(lon2);
   double s = 2 * asin(sqrt(pow(sin(a/2),2)+cos(radLat1)*cos(radLat2)*pow(sin(b/2),2)));
   s = s * 6378137;   
   return s;
}

C语言十六进制字符串与字节数组相互转换

直接上代码片段

/**
 * 字节数组转字符串
 * @param source
 *  字符数组
 * @param length
 *  字符数组长度
 * @param target
 *  字符串
 */
void uint8_2_hex(unsigned char *source, unsigned int length, unsigned char *target) {
    unsigned char ddl, ddh;
    for (int i = 0; i < length; i++) {
        ddh = static_cast<unsigned char>(48 + source[i] / 16);
        ddl = static_cast<unsigned char>(48 + source[i] % 16);
        if (ddh > 57) ddh = static_cast<unsigned char>(ddh + (97 - 58));
        if (ddl > 57) ddl = static_cast<unsigned char>(ddl + (97 - 58));
        target[i * 2] = ddh;
        target[i * 2 + 1] = ddl;
    }
}

/**
 * 字符串转字节数组
 * @param source
 *  字符串
 * @param length
 *  字符串长度
 * @param target
 *  字节数组
 * @param n
 *  转换后长度
 */
void hex_2_uint8(const unsigned char *source, size_t length, unsigned char *target, size_t &n) {
    n = 0;
    for (int i = 0; i < length; i += 2) {
        if (source[i] >= 'a' && source[i] <= 'f') {
            target[n] = static_cast<unsigned char>(source[i] - 'a' + 10);
        } else if (source[i] >= 'A' && source[i] <= 'F') {
            target[n] = static_cast<unsigned char>(source[i] - 'A' + 10);
        } else {
            target[n] = static_cast<unsigned char>(source[i] - '0');
        }
        if (source[i + 1] >= 'a' && source[i + 1] <= 'f') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'a' + 10));
        } else if (source[i + 1] >= 'A' && source[i + 1] <= 'F') {
            target[n] = static_cast<unsigned char>((target[n] << 4) | (source[i + 1] - 'A' + 10));
        } else {
            target[n] = (target[n] << 4) | (source[i + 1] - '0');
        }
        ++n;
    }
}

区块链相关的一些开源库

加密算法库:https://github.com/trezor/trezor-crypto

区块链相关的各种加密、编码算法库

以太坊IOS开发库:https://github.com/ethers-io/ethers.objc

使用Object-C编写的以太坊开发库

以太坊钱包:https://github.com/ethers-io/EthersWallet-ios

使用ethers-io框架开发的IOS以太坊钱包

椭圆曲线加密:https://github.com/bitcoin-core/secp256k1

比特币椭圆曲线加密库

SECP256K1库IOS版:https://github.com/beyonderyue/ios-secp256k1

SECP256K1编译为IOS库

以太坊JAVA版:https://github.com/ether-camp/ethereum-harmony

基于ethereumJ实现

WordPress环境 云服务器CentOS 装机全过程

0x00、首先你要有台云服务器,并在控制台安装CentOS7.4-64位

0x01、使用SSH Shell链接服务IP

常用SSH Shell 工具有 windows: XShell、Secure Shell等等

Linux系统下可以直接使用终端 iTerm

0x02、修改SSH登录端口

一、修改sshd_confg配置文件

找到文件中的 Port 22 ,把前面的#注释去掉,改成自己想要的端口!

二、开放端口防火墙

1、执行:iptables -I INPUT -p tcp -m state –state NEW -m tcp –dport 端口号 -j ACCEPT

2、执行:iptables-save

3、执行:iptables -nL –line-number 可以查看端口开放情况

4、执行:systemctl restart sshd.service 重启SSH服务

0x03、安装LNMP

整个安装过程需要几十分钟

1、执行:wget http://soft.vpser.net/lnmp/lnmp1.5.tar.gz -cO lnmp1.5.tar.gz && tar zxf lnmp1.5.tar.gz && cd lnmp1.5 && ./install.sh lnmp

选择MariaDB 10.2.14、Install PHP 7.2.6、 Don’t install Memory Allocator

0x04、安装GIT(可选)

由于网站代码托管在GIT上,所以通过GIT来更新网站。

注意:nginx等网站服务器一直要禁止.git目录的访问
在server{}段内增加

location ~ /\.
{
deny all;
}

0x05、上传网站代码

如果使用git,直接通过git clone https://github.com/xxxx.git 获取代码

0x06、nginx配置vhost与SSL

配置wordpress (用于解决固定链接问题),进入cd /usr/local/nginx/conf 创建 wordpress.conf 内容为:


cd /usr/local/nginx/conf/vhost 创建 abc.com.conf 和 abc.com.ssl.conf 配置域名服务和SSL

内容为(abc.com.conf)

server
    {
        listen 80;
        server_name abc.com;
        return 301 https://$server_name$request_uri;
    }

(abc.com.ssl.conf)

server
    {
        listen 443 ssl;
        server_name abc.com;
        ssl_certificate     /opt/abc.com/Nginx/1_abc.com_bundle.crt;
        ssl_certificate_key /opt/abc.comNginx/2_abc.com.key;
        index index.html index.htm index.php;
        root  /website/abc.com/;
        error_page   404   /404.html;
        include enable-php.conf;
        include wordpress.conf;
        location /nginx_status
        {
            stub_status on;
            access_log   off;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }

        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
        location ~ /\
        {
            deny  all;
        }
        access_log  /website/wwwlogs/abc.com.log;
    }

ssl_certificate和ssl_certificate_key为证书路径

0x07、修改php.ini配置

打开vim /usr/local/php/etc/php.ini
找到disable_functions 把 scandir 删除.
重启/etc/init.d/php-fpm restart

0x08、修改网站目录Owner和权限

改成www用户\组(千万别搞错目录)

chown www:www -R 网站目录
chmod -R 755 wp-content/

0x09、创建网站数据库用户

 

C语言随机函数与随机种子

C语言随机函数rand(),使用该函数会产生0-RAND_MAX (0x7fffffff)之间的随机数,直接这么使用有个很大的问题 程序每次运行产生的随机数序列都是相同的 (这里指的是随机序列,并不是指rand()每次结果相同)

例如:

#include <iostream>

int main() {
    for (int i = 0; i < 10; i++) {
            std::cout << rand() << ",";
    }
    return 0;
}

第一次输出结果为: 16807,282475249,1622650073,984943658,1144108930,470211272,101027544,1457850878,1458777923,2007237709,
第二次输出结果为: 16807,282475249,1622650073,984943658,1144108930,470211272,101027544,1457850878,1458777923,2007237709,

无论运行多少次,我们会发现输出结果都是一致的,原因是因为没有指定随机种子,系统会默认随机种子为1

执行下面代码

#include <iostream>

int main() {
    srand(1);
    for (int i = 0; i < 10; i++) {
            std::cout << rand() << ",";
    }
    return 0;
}

输出结果也是:16807,282475249,1622650073,984943658,1144108930,470211272,101027544,1457850878,1458777923,2007237709,
所以说为了保证程序每次产生的随机数不同,需要保证程序每次启动的随机种子不同,通常可以使用系统时间作为随机种子time(NULL)
这个随机序列和电脑相关的,不同的电脑即使随机种子一致,产生的随机序列也是不一致的。换了一台电脑同样的代码输出的结果是:41,18467,6334,26500,19169,15724,11478,29358,26962,24464,

#include <iostream>

int main() {
    srand(time(NULL));
    for (int i = 0; i < 10; i++) {
            std::cout << rand() << ",";
    }
    return 0;
}

第一次输出结果为:1784895276,535838789,1443594852,228433758,1732893517,568119605,673906673,520698833,389424706,1678361333,
第二次输出结果为:1785550749,814955265,302438289,2134014421,1255985200,1726490037,319013595,1542308253,1447188881,503737045,

函数说明

srand 函数用来设置随机种子
rand 函数用来生成随机数

C语言数组加取地址符(&)和不加取地址符(&)的区别

实践出真知,直接上代码:

#include <iostream>

int main() {
    short s[4] = {0x01, 0x21, 0x32, 0x53};
    printf("&s的值:%u\n", &s);
    printf("s的值:%u\n", s);
    printf("&s+1的值:%u\n", &s + 1);
    printf("s+1的值:%u\n", s + 1);
    printf("&s[1]的值:%u\n", &s[1]);
    printf("s[1]的值:%u\n", s[1]);
    return 0;
}

输出结果:
&s的值:3805102112
s的值:3805102112
&s+1的值:3805102120
s+1的值:3805102114
&s[1]的值:3805102114
s[1]的值:33

得出结论:
&s数组首地址
s数组首地址
&s+1数组首地址 + sizeof(short) * 元素个数
s + 1数组首地址+ sizeof(short),第二个元素的地址
&s[1]数组第二个元素的地址
s[1]数字元素的值