Menu Home

C/C++

Boost Serialization : Use Non-Default Constructors

#include <fstream> #include <cstring> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> class gps_position { public: gps_position(int size) { std::cout << “constructor: one” << std::endl; m_size = size; buf = (unsigned char *)malloc(size); memset(buf, 0, sizeof(buf)); } gps_position(int d, int m, float s, int bufSZ) : degrees(d), minutes(m), seconds(s) { std::cout << “constructor: two” […]

linux c 解析FLV文件

FLV文件组成 FLV文件由Header和Body两部分组成。 FLV Header 域名 类型 说明 Signature UI8 Signature byte always ‘F’ (0x46) Signature UI8 Signature byte always ‘L’ (0x4C) Signature UI8 Signature byte always ‘V’ (0x56) Version UI8 File version (for example, 0x01 for FLV version 1) TypeFlagsReserved UB[5] Must be 0 TypeFlagsAudio UB[1] Audio tags are present […]

linux c 使用socket处理HTTP请求

#include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/select.h> #define BUFSIZE 4096 int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; charhttpRequest[BUFSIZE], buf[BUFSIZE]; bzero(httpRequest, sizeof(httpRequest)); //构建请求信息,这里请求http://192.168.2.184:8090/test.flv,这是一个由ffserver搭建的流媒体服务 strcat(httpRequest, “GET /test.flv HTTP/1.1\n”); strcat(httpRequest, “Host: 192.168.2.184:8090\n”); strcat(httpRequest, “User-Agent: Mozilla/5.0 (X11; […]

Linux串口编程详解

串口本身,标准和硬件 串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。 某些计算机使用一个叫做UART的集成电路来作为串口设备。这个集成电路可以进行字符和异步串行通讯序列之间的转换,并且可以自动地处理数据的时序。而某些低端设备则会让CPU直接通过输出针来传送数据,这种技术叫做bit-banging。 因为“串口”,RS-232和UARTs基本上总是在同一个语境中出现,所以这些名词通常会被搞混。下面逐一解释以下一些重要的名词和术语。 什么是串行通信 计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。 当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。每个位可能是on(1)或者off(0)。很多技术术语中经常用mark表示on,而space表示off。 串行数据的速度通常用每秒传输的字节数bits-per-second(bps)或者波特率(baud)表示。这个值表示的是每秒钟被送出的0和1的个数。很久很久以前,300bps就是很快的速度了,而现在的电脑可以处理高达430,800的RS-232速率。表示波特率的单位还有kpbs和Mbps,1kps=1000bps而1Mbps=1000kbps。 一般有人提到串行设备的时候,它通常说可能是某种数据通讯设备-DCE(Data Communications Equipment)或者数据终端设备-DTE(Data Terminal Equipment)。它们之间的区别非常简单,每个信号对,比如传送和接收,它们俩正好是相反的。如果需要将两个DTE或者DCE设备连接起来的话,需要适配器或者交叉线缆将信号对交换。

ffmpeg的内部Video Buffer管理和传送机制

ffmpeg的内部Video Buffer管理和传送机制 本文主要介绍ffmpeg解码器内部管理Video Buffer的原理和过程,ffmpeg的Videobuffer为内部管理,其流程大致为:注册处理函数->帧级释放->帧级申请->清空。 1 注册get_buffer()和release_buffer() FFAPI_InitCodec() avcodec_alloc_context() avcodec_alloc_context2() avcodec_get_context_default2(AVCodecContext *s,…){ …… s->get_buffer = avcodec_default_get_buffer; s->release_buffer = avcodec_default_release_buffer; …… } 2帧级的内存申请和释放调用

linux c获取系统网卡信息

OS:ubuntu 12.04 int getNetCardCount() { int nCount = 0; FILE *file = fopen(“/proc/net/dev”, “r”); if(!file) { debug(“Open /proc/net/dev failed by %s !\n”, strerror(errno)); return nCount; } char szLine[512]; fgets(szLine, sizeof(szLine), file); fgets(szLine, sizeof(szLine), file); while(fgets(szLine, sizeof(szLine), file)) { char szName[128] = {0}; sscanf(szLine, “%s”, szName); int nLen = strlen(szName); if(nLen <= […]

APUE的编译问题

APUE的编译问题 本文解决一些APUE一书中例子编译过程中的问题 OS: ubuntu 12.04 问题 /usr/include/bits/timex.h:31:7:error: expect ‘:’ , ‘,’ , ‘;’ , ‘}’ or ‘__attribute__’ 解决 apue.2e/ipp/ipp.h中 #define status u.st 与 timex.h中的 status 冲突,更改 #define Status u.st 问题 ARG_MAX 未定义 解决 在include/apue.h中加入 #define ARG_MAX 4096 在threadctl/getenv1.c 加入 #include “../include/apue.h” 在threadctl/getenv3.c 加入 #include “../include/apue.h” OS: mac os 10.7.4 问题 […]

有趣的编程题

有趣的编程题 问题:下面这段代码的输出是什么? int func(int x) { int countx = 0; while(x) { countx++; x = x&(x-1); } return countx; } 假定x = 9999 10011100001111 答案: 8 思路: 将x转化为2进制,看含有的1的个数。 注: 每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。

FFMPEG + SDL音频播放分析

抽象流程: 设置SDL的音频参数 —-> 打开声音设备,播放静音 —-> ffmpeg读取音频流中数据放入队列 —-> SDL调用用户设置的函数来获取音频数据 —-> 播放音频 SDL内部维护了一个buffer来存放解码后的数据,这个buffer中的数据来源是我们注册的回调函数(audio_callback),audio_callback调用audio_decode_frame来做具体的音频解码工作,需要引起注意的是:从流中读取出的一个音频包(avpacket)可能含有多个音频桢(avframe),所以需要多次调用avcodec_decode_audio4来完成整个包的解码,解码出来的数据存放在我们自己的缓冲中(audio_buf2)。SDL每一次回调都会引起数据从audio_buf2拷贝到SDL内部缓冲区,当audio_buf2中的数据大于SDL的缓冲区大小时,需要分多次拷贝。 关键实现: main()函数 int main(int argc, char **argv){ SDL_Event event; //SDL事件变量 VideoState *is; // 纪录视频及解码器等信息的大结构体 is = (VideoState*) av_mallocz(sizeof(VideoState)); if(argc < 2){ fprintf(stderr, “Usage: play <file>\n”); exit(1); } av_register_all(); //注册所有ffmpeg的解码器 /* 初始化SDL,这里只实用了AUDIO,如果有视频,好需要SDL_INIT_VIDEO等等 */ if(SDL_Init(SDL_INIT_AUDIO)){ fprintf(stderr, “Count not initialize SDL – […]

png转换OpenGL Texture

bool loadPngImage(char *name, int *outWidth, int *outHeight, bool *outHasAlpha, GLubyte **outData) { png_structp png_ptr; png_infop info_ptr; unsigned int sig_read = false; int color_type, interlace_type; FILE *fp; printf(“png file : %s\n”, name); if((fp = fopen(name, “rb”)) == NULL) { printf(“%s: open png file error: \n”, __FILE__); perror(“open filed:\n”); return false; } […]

埃拉托斯特尼筛选法

埃拉托斯特尼筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前274~194年)发明的,又称埃拉托斯特尼筛子。 具体做法是: 先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。) using std::size_t; using std::sqrt; using std::string; class SieveTest : public TestSuit::Test { string sieveChars; public: SieveTest() : sieveChars(50, ‘P’) {} void run() { findPrimes(); testPrimes(); } bool isPrime(int p) { if(p == 0 || p == 1) return false; int root = int(sqrt(double(p))); for(int i = 2; […]

linux下使用C语言生成bitmap

#ifndef SAVEBMP_H #define SAVEBMP_H #include <stdio.h> #include <stdlib.h> typedef long LONG; typedef unsigned char BYTE; typedef unsigned int DWORD; typedef unsigned short WORD; typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BMPFILEHEADER_T; typedef struct { DWORD biSize; DWORD biWidth; DWORD biHeight; WORD biPlanes; WORD […]

linux多线程之pthread_detach

pthread_detach(pthread_self()) linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态, 如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。 若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。 unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join。(网络资料) pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(pID, &attr, func,NULL); pthread_attr_destroy(&attr); 在func函数中使用: pthread_detach(pthread_self()); //分离thread,释放线程资源

结构体中的冒号:位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为: 域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度 例如: struct bs { int a:8; int b:2; int c:6; }; 位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: struct bs { int a:8; int b:2; int c:6; }data; 说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct bs { unsigned a:4 unsigned :0 /*空域*/ unsigned b:4 /*从下一单元开始存放*/ unsigned c:4 } 这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如: struct k { int a:1 int […]