显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Mihooke's blog

IT之恋

 
 
 
 
 
 

[置顶] 关于mihooke这个人

2015-4-30 23:20:51 阅读137 评论0 302015/04 Apr30

本人网名Mihooke,源自航海王里的原七武海之一"鹰眼"---乔拉可尔·米霍克,甚喜之,遂取之音译英文于自用。

Mihooke是茫茫猿类中的一枚C++ developer ,目前正在成长中,努力学习各种技术!

联系我:

QQ:1733133832Git:https://github.com/mihookeE-mail:sadandeduoluozhich@163.com         mihooke@hotmail.com

技术宅们,有兴趣一起交流吧!

作者  | 2015-4-30 23:20:51 | 阅读(137) |评论(0) | 阅读全文>>

Python struct pack使用

2017-9-24 13:00:53 阅读0 评论0 242017/09 Sept24

struct package 里的pack和unpack用于把各种内置数据类型的数据转换成字节流,通常用于网络传输和数据本地化。基本格式是:

pack('<if7s', 1, 2.0, b"mihooke")

输出:

b'\x01\x00\x00\x00\x00\x00\x00@mihooke'

'<if7s'表示将后面参数格式化的形式,<是按小端字节序,1转换成4字节的int类型,2.0转换成4字节的float类型,"mihooke"转换成7字节的char[]类型

其中<符号有以下几种方式

@ 本地字节序(如果不写,则@是默认值) = 本地字节序 < 小端字节序 >大端字节序  ! 网络字节序(即大端字节序)

下面这个例子来说明网络传输的使用

server:

from struct import pack, unpack_from

import socket

if __name__ == "__main__":

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind(("127.0.0.1", 9527))

s.listen(1)

conn, addr = s.accept()

作者  | 2017-9-24 13:00:53 | 阅读(0) |评论(0) | 阅读全文>>

Python中json使用

2017-9-10 8:58:29 阅读8 评论0 102017/09 Sept10

JSON是基于“key/value”的一种数据格式,类似下面

// JSON object

{

"key1":value1

"key2":value2

}

or // JSON array

[

{

"key3":value3

"key4":value4

},

{

"key5:value5

}

]

可以看到,JSON object类似于dict类型,解析之后的类型就是dict类型

import json

if __name__ == "__main__":

# dumps方法是将变量转换为json对象

js_data = '{"key1":1, "key2":2}'

dict1 = json.dumps(js_data)

print(dict1)

输出:

"{\"key1\":1, \"key2\":2}"

JSON array类似于list类型,解析之后是list类型

js_data2 = [

{

"key3":"value3",

"key4":4

作者  | 2017-9-10 8:58:29 | 阅读(8) |评论(0) | 阅读全文>>

error: invalid initialization of non-const reference of type

2017-9-3 9:33:13 阅读10 评论0 32017/09 Sept3

这个错误出现在gcc编译器上,看代码

// declaration

void testVector(QVector<int> &v);

// use ,transfer a null-vector

w.testVector(QVector<int>());

这时候进行编译,会出现该错误:

消除错误很简单,只需要给 testVector函数传递一个外部的QVector<int>变量即可:

QVector<int> v;

w.testVector(v);

原理:

gcc编译器不允许传递给函数一个临时的对象,必须要从外部显式构造一个对象,这一点比VC++要严格点,写跨平台程序的需要注意这点。

作者  | 2017-9-3 9:33:13 | 阅读(10) |评论(0) | 阅读全文>>

常用Git命令

2017-8-27 13:25:05 阅读13 评论0 272017/08 Aug27

本文汇总了常用的几条Git命令。

提交改变内容,并添加注释

git commit -a -m "comment"

拉取某个分支的代码

git pull origin mihooke_branch

上传某个分支的代码

git push origin mihooke_branch

创建分支

git checkout mihooke_branch

删除远程分支

git push origin --delete mihooke_branch

删除本地分支

git branch -D mihooke_branch

查看git 提交日志

git reflog

恢复某个提交版本(XXX是指git reflog列出的某个ID值)

git reset --hard XXX

作者  | 2017-8-27 13:25:05 | 阅读(13) |评论(0) | 阅读全文>>

使得一个函数返回固定元素的数组

2017-6-10 18:31:13 阅读20 评论0 102017/06 June10

在C++11之前,如果我们要实现一个函数返回一个数组,比如,返回一个int数组,通常我们会定义一个int指针,而这个指针一般是指向堆内存(因为函数不能返回局部对象),然后让该函数返回该int指针,类似

int *MyFunc(...)

{

int *ptr = new int[NUM];

return ptr;

}

这样做会有一些小问题:该函数的使用者必须时刻牢记释放内存。

C++11提供了一种返回数组的方法,示例如下

typedef int arr[NUM];

using arr = int[NUM];

arr *func()

{

}

其中using语句就是表示arr是包含NUM个int元素的数组,arr可以直接当做函数的返回值。

还有一种方法就是声明一个返回数组指针的函数,示例如下

int (*func(int i))[NUM];

这样的表示法也是返回一个数组的指针,该数组包含NUM个int元素。

另外,C++11还提供了一种方法:尾置返回类型,这种方式可以随意设定函数的返回类型,示例如下

auto func(int i) -> int(*)[NUM]

在函数的参数之后加个指针运算符,后面是返回类型,比如int(*)[NUM]就是包含NUM个int元素的数组指针。

作者  | 2017-6-10 18:31:13 | 阅读(20) |评论(0) | 阅读全文>>

socket发送结构体--不使用封包拆包

2017-5-20 11:07:18 阅读27 评论0 202017/05 May20

socket通讯中传输struct怎么办,第一我们想到的肯定是对struct进行封包和拆包,封包和拆包是为了防止粘包的发生,即在发送struct的前面加一个4字节的变量,该变量表示要发送struct的长度(以字节为单位计算),并且在发送端我们还要对每个struct的成员进行单独封包,并转换成网络字节序;在接收端首先接收4个字节,读取出该次通信所要接受的长度,再对每个struct的成员进行单独拆包,并转换成主机字节序,有多少个成员,那么就需要进行多少次的封包和拆包,这个过程看起来有点繁琐,其实这是很规范的写法。

这里有一种偷懒的做法,既然socket中通讯的是字节流,而char的单位也是字节,我何不把struct中的每个数据转为char进行传输呢?只需要在接收端再按照固定的格式把接收到的数据进行内存拷贝至struct中。示例如下:

发送端:

typedef struct Send_data

{

char c;

short s;

int n;

double d;

char arr[10];

}SENDDATA;

SENDDATA oData;

oData.c = '1';

oData.s = 10;

oData.n = 100;

oData.d = 1.2f;

strcpy(oData.arr, "mihooke");

send(sockWorker, (char*)&oData, sizeof(oData), 0);

作者  | 2017-5-20 11:07:18 | 阅读(27) |评论(0) | 阅读全文>>

select实现多个client连接

2017-5-13 19:50:18 阅读25 评论0 132017/05 May13

利用select实现server和多个client实现通信。Master作为server,Worker和PLCWorker作为client。select函数在listen和accept中间使用

Master.cpp

#include <iostream>

#include <WinSock2.h>

#include <tchar.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")

int main()

{

WORD wVersionRequsted;

WSADATA wsaData;

wVersionRequsted = MAKEWORD(2, 2);

int nErr = WSAStartup(wVersionRequsted, &wsaData);

if (nErr != 0)

{

WSACleanup();

return 1;

}

if (LOBYTE(wsaData.wVersion) != 2 && HIBYTE(wsaData.wVersion) != 2)

{

WSACleanup();

return 2;

作者  | 2017-5-13 19:50:18 | 阅读(25) |评论(0) | 阅读全文>>

创建子进程来建立多个client连接

2017-5-13 19:40:58 阅读25 评论0 132017/05 May13

Master要和2个worker:worker1和Woeker2通信,当Master和worker1建立通信之后,可以创建一个子进程SubMaster,SunMaster和Worker2进行通信,从而达到server和多个client进行通信的目的。

Master.cpp

#include <iostream>

#include <WinSock2.h>

#include <wchar.h>

#include <tchar.h>

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#define MYNAMEDPIPE _T("\\\\.\\pipe\\MIHOOKE")

int main()

{

WORD wVersionRequired;

WSADATA wsaData;

wVersionRequired = MAKEWORD(2, 2);

int nErr = WSAStartup(wVersionRequired, &wsaData);

if (nErr != 0)

{

cout<<"WSAStartup ret error"<<endl;

WSACleanup();

作者  | 2017-5-13 19:40:58 | 阅读(25) |评论(0) | 阅读全文>>

回调和观察者模式

2017-4-11 21:13:19 阅读39 评论0 112017/04 Apr11

在C和C++中,回调是一个模块中的函数指针,可以调用另一个模块中的函数,并且后者不存在对前者的包含或链接依赖。回调的这种特性,使得低层代码能够执行与其不能有依赖关系的高层代码。比如,上位机程序需要调用算法DLL的函数进行处理工作,算法提供了相应头文件和DLL,我们在上位机程序中就可以使用函数指针来调用算法接口函数,而不用让整个工程包含算法DLL编译库,从而降低两者之间的耦合。

有时候,需要通过回调函数来传递参数,可以用一个“闭包”来解决,下面是一个例子:

class CallBackClass

{

public:

typedef void(*CallBackFunc)(char *str, void *data);

void SetCallBack(CallBackFunc, void *data);

private:

CallBackFunc m_cbf;

void *m_data;

};

使用:

if (m_cbf)

{

(*m_cbf)("mihooke", m_data);

}

不过C++中这种封装使用有一个问题,那就是非static成员函数自带this指针,因为this指针也需要传递,这时候当作回调函数会比较复杂,可以为每个成员函数创建一个static方法,并且使用额外的回调参数来传递this指针。

作者  | 2017-4-11 21:13:19 | 阅读(39) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 

发现好博客

 
 
列表加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 

天气

 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
心情随笔列表加载中...
 
 
 
 
 

标签

 
 
数据加载中...
 
 
 
 
 
 
 

北京市 海淀区 摩羯座

 发消息  写留言

 
QQ1733133832
E-Mail sadandeduoluozhich@163.com
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017

注册 登录  
 加关注