Menu Home

C/C++

FileName Checker

/* A-Za-z0-9_- */ static int safe_filename(const char *f) { const char *start = f; for (; *f; f++) { if (!((unsigned)((*f | 32) – ‘a’) < 26 || (unsigned)(*f - '0') < 10 || *f == '_' || *f == '-')) { if (f == start) return 0; else if […]

定制operator new记录分配的内存大小

调用operator new的时候在所分配的内存的第一个字节中记录本次new分配的内存大小。 void* operator new(size_t size) throw(bad_alloc){ if(size == 0) size = 1; void* address = NULL; size_t *p = NULL; while(true) { p = (size_t*)malloc(size + sizeof(size_t)); if(p) break; new_handler oldHandler = set_new_handler(0); set_new_handler(oldHandler); if(oldHandler) (*oldHandler)(); else throw bad_alloc(); } p[0] = size; address = (void*)(&p[1]); return address; } […]

C/C++调用JNI的区别

C++支持真正的对象而C不支持对象,所有C和C++调用JNI函数的时候会有一些细微的区别。 C++: JavaVM* vm JNIEnv* env = NULL; vm->GetEnv((void**)&env, JNI_VERSION_1_6); env->FindClass(“main”); C: JavaVM* vm JNIEnv* env = NULL; (*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6); (*env)->FindClass(env, “main”);

使用Invocation API调用Java类

InvocationApiTest.java import java.io.*; public class InvocationApiTest { public static void main(String[] args) { System.out.println(args[0]); } } invocationApi.c #include <jni.h> int main() { JNIEnv* env; JavaVM* vm; JavaVMInitArgs vm_args; JavaVMOption options[1]; jint res; jclass cls; jmethodID mid; jstring jstr; jclass stringClass; jobjectArray args; //1.生成Java虚拟机选项 options[0].optionString = “-Djava.class.path=.”; vm_args.version = JNI_VERSION_1_6; vm_args.options […]

c++: 获取delete[]中的数组大小

看一个小例子: #include <iostream> using namespace std; class A { public: A() { cout << “A::A()” << endl; } ~A() { cout << “A::~A()” << endl; } }; int main() { A* a = new A[5]; delete[] a; return 0; } 编译执行输出: A::A() A::A() A::A() A::A() A::A() A::~A() A::~A() A::~A() A::~A() […]

C: 数组形参

知识这个东西,真是知道的越多就不知道的越多,C/C++这塘水得多深啊,哈哈。 看下面3个片段: void fun(char a[100]) { fprintf(stderr, “%s\n”, a); } int main(void) { char aa[200] = “abcdef”; fun(aa); } void fun(char a[]) { fprintf(stderr, “%s\n”, a); } int main(void) { char aa[200] = “abcdef”; fun(aa); } void fun(char* a) { fprintf(stderr, “%s\n”, a); } int main(void) { char aa[200] = […]

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帧级的内存申请和释放调用