嵌入式linux开发实用工具小程序

Table of Contents

(一)十六进制字符转整型数字

(二)字符串转整型

(三)创建文件并填充固定数据

(四)批量处理图片

(五)海思HI3520 IO控制小程序

(六)路由追踪

(七)文件固定位置插入数据

(七)H264 I帧与P帧偏移

(八)获取本地IP地址


    在学习和工作开发的时候,经常需要使用到各种各样不太常用的操作,这种情况一般是自己手动写一些小程序来处理。因为它们不太常用,所以经常用了又没保存,等到下一次在使用的时候又需要重写,这样的非常浪费时间和精力。所以想在这里统一记录一下,以备下次重新使用。代码以实用为主,如果缺陷,欢迎指出。


(一)十六进制字符转整型数字

    功能:将16进制的字符串转换为10进制的数字。我是没有找到相应的库函数,所以参考网上的代码自己手动写了个函数来实现。常用的函数有atoi,atol,他们都是将10进制的数字字符串转换为int或是long类型,所以在有些情况下不适用。

/*=============================================================================
#     FileName: hex2dec.cpp
#         Desc: Convert a hex string to a int number
#       Author: Caibiao Lee
#      Version: 
#   LastChange: 2018-11-26 
#      History:
=============================================================================*/

#include   
#include   
#include   
#include 

int c2i(char ch)  
{  
    // 如果是数字,则用数字的ASCII码减去48, 如果ch = '2' ,则 '2' - 48 = 2  
    if(isdigit(ch))  
            return ch - 48;  

    // 如果是字母,但不是A~F,a~f则返回  
    if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )  
            return -1;  

    // 如果是大写字母,则用数字的ASCII码减去55, 如果ch = 'A' ,则 'A' - 55 = 10  
    // 如果是小写字母,则用数字的ASCII码减去87, 如果ch = 'a' ,则 'a' - 87 = 10  
    if(isalpha(ch))  
            return isupper(ch) ? ch - 55 : ch - 87;  

    return -1;  
} 

int hex2dec(char *hex)  
{  
    int len;  
    int num = 0;  
    int temp;  
    int bits;  
    int i;  
    char str[64] = {0};

	if(NULL==hex)
	{
		printf("input para error \n");
		return 0;
	}


	if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1])))
	{
		strcpy(str,&hex[2]);
	}else
	{
		strcpy(str,hex);
	}
	
	printf("input num = %s \n",str);
	
    // 此例中 str = "1de" 长度为3, hex是main函数传递的  
    len = strlen(str);  

    for (i=0, temp=0; i

运行结果: 

biao@ubuntu:~/test/flash$ ./a.out 0x400
input num = 400 
value hex = 0x400 
value dec = 1024 
biao@ubuntu:~/test/flash$ 

(二)字符串转整型

     功能:将正常输入的16进制或是10进制的字符串转换为int数据类型

/*=============================================================================
#     FileName: hex2dec.cpp
#         Desc: Convert a hex/dec string to a int number
#       Author: Caibiao Lee
#      Version: 
#   LastChange: 2018-12-03 
#      History:
=============================================================================*/
#include   
#include   
#include   
#include 

int String2int(char *strChar)
{
	int len=0;
	const char *pstrCmp1="0123456789ABCDEF";
	const char *pstrCmp2="0123456789abcdef";
	
	char *pstr=NULL;
	int uiValue=0;
	int j=0;	
	unsigned int t=0;
	int i=0;
	if(NULL==strChar)
		return -1;
	if(0>=(len=strlen((const char *)strChar)))
		return -1;
	if(NULL!=(pstr=strstr(strChar,"0x"))||NULL!=(pstr=strstr(strChar,"0X")))
	{
		pstr=(char *)strChar+2;
		
		if(0>=(len=strlen((const char *)pstr)))
			return -1;
		for(i=(len-1);i>=0;i--)
		{
			if(pstr[i]>'F')
			{
				for(t=0;t

(三)创建文件并填充固定数据

    功能:创建固定大小的一个文件,并且把这个文件填充为固定的数据。

/*=============================================================================
#     FileName: CreateFile.cpp
#         Desc: 创建固定大小的文件,然后填充固定的数据
#       Author: Caibiao Lee
#      Version: 
#   LastChange: 2018-11-26 
#      History:
=============================================================================*/
#include   
#include   
#include   
#include 

//#define	FILL_DATA_VALUE		0xff
#define	FILL_DATA_VALUE		0x30 //char 0

int c2i(char ch)  
{  
    if(isdigit(ch))  
            return ch - 48;  

    if( ch < 'A' || (ch > 'F' && ch < 'a') || ch > 'z' )  
            return -1;  

    if(isalpha(ch))  
            return isupper(ch) ? ch - 55 : ch - 87;  

    return -1;  
} 

int hex2dec(char *hex)  
{  
    int len;  
    int num = 0;  
    int temp;  
    int bits;  
    int i;  
    char str[64] = {0};

	if(NULL==hex)
	{
		printf("input para error \n");
		return 0;
	}

	if(('0'==hex[0])&&(('X'==hex[1])||('x'==hex[1])))
	{
		strcpy(str,&hex[2]);
	}else
	{
		strcpy(str,hex);
	}
	
	printf("input num = %s \n",str);
	
    len = strlen(str);  

    for (i=0, temp=0; i

运行结果:

biao@ubuntu:~/test/flash$ gcc CreateFile.cpp 
biao@ubuntu:~/test/flash$ ls
a.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.bin
biao@ubuntu:~/test/flash$ ./a.out ./out.bin 0x10
input num = 10 
Need To Write Data Len 16 
Fill Data Vale = 0x30 
biao@ubuntu:~/test/flash$ ls
a.out  CreateFile.cpp  hex2dec.cpp  main.cpp  out.bin
biao@ubuntu:~/test/flash$ vim out.bin 
  1 0000000000000000                                     

(四)批量处理图片

功能:批处理将图片前面固定的字节数删除。

/*=============================================================================
#     FileName: CutFile.cpp
#         Desc: 批量处理,将图片的前面固定字节删除
#       Author: Caibiao Lee
#      Version: 
#   LastChange: 2018-11-26 
#      History:
=============================================================================*/
#include 
#include 
#include 
#include 
#include 


#define START_READ_POSITION		128
#define PHOTO_START_TIME		83641
//l_s32PhotoTime = 92809;

int Cut_file(char * InputFile)
{
	FILE *l_pFileInput = NULL;
	FILE *l_pFileOutput = NULL;
	char l_ars8OutputName[128] = {0};
	unsigned char l_arru8TempData[1024] = {0};
	int l_s32Ret = 0;
	static unsigned int ls_u32Num = 0;

	
	if(NULL== InputFile) 
	{
		goto ERROR;
	}
	
	//sprintf(l_ars8OutputName,"./outfile/_%s",&InputFile[8]);
	sprintf(l_ars8OutputName,"./outfile/00%d.jpg",ls_u32Num++);

	//printf("out file name %s \n",l_ars8OutputName);
	
	l_pFileInput = fopen(InputFile,"rb+");
	if(NULL==l_pFileInput)
	{
		printf("input file open error\n");
		goto ERROR;
	}

	l_pFileOutput = fopen(l_ars8OutputName,"w+");
	if(NULL==l_pFileOutput)
	{
		printf("out file open error\n");
		goto ERROR;
	}

	fseek(l_pFileInput,START_READ_POSITION,SEEK_SET);

	while(!feof(l_pFileInput))
	{
		l_s32Ret = fread(l_arru8TempData,1,1024,l_pFileInput);
		if(l_s32Ret<0)
		{
			break;
		}

		l_s32Ret = fwrite(l_arru8TempData,1,l_s32Ret,l_pFileOutput);
		if(l_s32Ret<0)
		{
			break;
		}
	}

ERROR:
	if(NULL!=l_pFileOutput)
	{
		fclose(l_pFileOutput);
		l_pFileOutput =NULL;
	};

	if(NULL !=l_pFileInput);
	{
		fclose(l_pFileInput);
		l_pFileInput =NULL;
	}
}

int main(void)
{
	char l_arrs8InputName[128] = {0};
	char l_s8PhotoChannel = 0;
	int  l_s32PhotoTime = 0;

	l_s8PhotoChannel = 3;
	l_s32PhotoTime = PHOTO_START_TIME;

	/**从第一通道开始**/
	for(int j=1;j

运行结果:

biao@ubuntu:~/test/photo$ gcc CutFile.cpp 
biao@ubuntu:~/test/photo$ ls
a.out  CutFile.cpp  image  outfile
biao@ubuntu:~/test/photo$ ./a.out 
./image/1Y083642.jpg
./image/1Y083714.jpg
./image/1Y083747.jpg
./image/1Y083820.jpg
./image/1Y083853.jpg
./image/1Y083925.jpg
./image/1Y084157.jpg
./image/1Y084228.jpg
./image/1Y084301.jpg
./image/1Y084334.jpg
./image/1Y084406.jpg
./image/1Y084439.jpg
./image/1Y084711.jpg
./image/1Y084742.jpg
./image/1Y173524.jpg
./image/1Y173556.jpg
./image/1Y173629.jpg
./image/1Y173702.jpg
./image/1Y173933.jpg
./image/1Y174004.jpg
./image/1Y174244.jpg
./image/1Y174315.jpg
./image/1Y174348.jpg
./image/1Y174420.jpg
./image/1Y174454.jpg
./image/1Y174733.jpg
biao@ubuntu:~/test/photo$ tree
.
├── a.out
├── CutFile.cpp
├── image
│   ├── 1Y083642.jpg
│   ├── 1Y083714.jpg
│   ├── 1Y083747.jpg
│   ├── 1Y083820.jpg
│   ├── 1Y083853.jpg
│   ├── 1Y083925.jpg
│   ├── 1Y084157.jpg
│   ├── 1Y084228.jpg
│   ├── 1Y084301.jpg
│   ├── 1Y084334.jpg
│   ├── 1Y084406.jpg
│   ├── 1Y084439.jpg
│   ├── 1Y084711.jpg
│   ├── 1Y084742.jpg
│   ├── 1Y173524.jpg
│   ├── 1Y173556.jpg
│   ├── 1Y173629.jpg
│   ├── 1Y173702.jpg
│   ├── 1Y173933.jpg
│   ├── 1Y174004.jpg
│   ├── 1Y174244.jpg
│   ├── 1Y174315.jpg
│   ├── 1Y174348.jpg
│   ├── 1Y174420.jpg
│   ├── 1Y174454.jpg
│   └── 1Y174733.jpg
└── outfile
    ├── 000.jpg
    ├── 0010.jpg
    ├── 0011.jpg
    ├── 0012.jpg
    ├── 0013.jpg
    ├── 0014.jpg
    ├── 0015.jpg
    ├── 0016.jpg
    ├── 0017.jpg
    ├── 0018.jpg
    ├── 0019.jpg
    ├── 001.jpg
    ├── 0020.jpg
    ├── 0021.jpg
    ├── 0022.jpg
    ├── 0023.jpg
    ├── 0024.jpg
    ├── 0025.jpg
    ├── 002.jpg
    ├── 003.jpg
    ├── 004.jpg
    ├── 005.jpg
    ├── 006.jpg
    ├── 007.jpg
    ├── 008.jpg
    └── 009.jpg

2 directories, 54 files
biao@ubuntu:~/test/photo$ 

    运行前需要创建两个目录,image用来存放需要处理的图片,outfile用来存放处理过后的文件。这种处理文件批处理方式很暴力,偶尔用用还是可以的。


(五)海思HI3520 IO控制小程序

嵌入式设备系统一般为了节省空间,一般都会对系统进行裁剪,所以很多有用的命令都会被删除。在嵌入式设备中要调试代码也是比较麻烦的,一般只能看串口打印。现在写了个小程序,专门用来查看和控制海思Hi3520DV300芯片的IO电平状态。

/*=============================================================================
#     FileName: Hi3520_IO_CTRL.cpp
#         Desc: Hi3520DV300 IO Write and  Read
#       Author: Caibiao Lee
#      Version: 
#   LastChange: 2018-11-30
#      History:
=============================================================================*/
#include 
#include 
#include "hstGpioAL.h"

int PrintfInputTips(char *ps8Name)
{
	printf("=========== error!!! ========\n\n");
	printf("usage Write: %s GPIO bit value \n", ps8Name);
	printf("usage Read : %s GPIO bit \n", ps8Name);
	printf("eg Write 1 to GPIO1_bit02  :     %s 1 2 1\n", ps8Name);
	printf("eg Read  GPIO1_bit02 Value :     %s 1 2 \n\n", ps8Name);
	
	printf("=============BT20==================\n")
	printf("USB HUB    GPIO_0_2  1_UP; 0_Down \n");
	printf("RESET_HD   GPIO_13_0 0_EN; 1_disEN\n");
	printf("Power_HD   GPIO_13_3 1_UP; 0_Down \n");
	return 0;
}

int main(int argc, char **argv)
{
	if((3!=argc)&&(4!=argc))
	{
		PrintfInputTips(argv[0]);
		return -1;
	}
	
	unsigned char l_u8GPIONum = 0;
	unsigned char l_u8GPIOBit = 0;
	unsigned char l_u8SetValue = 0;

	GPIO_GROUP_E  l_eGpioGroup;
	GPIO_BIT_E	  l_eBit;
	GPIO_DATA_E   l_eData;

	l_u8GPIONum   = atoi(argv[1]);
	l_u8GPIOBit   = atoi(argv[2]);

	if(l_u8GPIONum<14)
	{
		l_eGpioGroup = (GPIO_GROUP_E)l_u8GPIONum;
	}else
	{
		printf("l_u8GPIONum error l_u8GPIONum = %d\n",l_u8GPIONum);
		return -1;
	};

	if(l_u8GPIOBit<8)
	{
		l_eBit = (GPIO_BIT_E)l_u8GPIOBit;
	}else
	{
		printf("l_u8GPIOBit error l_u8GPIOBit = %d\n",l_u8GPIOBit);
		return -1;
	}

	if(NULL!=argv[3])
	{
		l_u8SetValue = atoi(argv[3]);
		if(0==l_u8SetValue)
		{
			l_eData = (GPIO_DATA_E)l_u8SetValue;
		}else if(1==l_u8SetValue)
		{
			l_eData = (GPIO_DATA_E)l_u8SetValue;
		}else
		{
			printf("l_u8SetValue error l_u8SetValue = %d\n",l_u8SetValue);
		}
	}
	
	if(3==argc)                                                       
	{/**read**/                                                                                                                                                      
	    printf("read GPIO%d Bit%d \n",l_u8GPIONum,l_u8GPIOBit);           
        /**set input**/                                               
        HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_INPUT);                        
                                                                                          
	    /**read **/                                                                               
	    char l_s8bit_val = 0;                                                                     
	    HstGpio_Get_Value(l_eGpioGroup, l_eBit, &l_s8bit_val);                                    
	                                                                                              
	    printf("read Data = %d \n",l_s8bit_val);                                                  
	                                                                                                
	  }else if(4==argc)                                                                             
	  {/**write**/                                                                                                                                                                            
	      printf("Write GPIO %d; Bit %d; Value %d\n",l_u8GPIONum,l_u8GPIOBit,l_u8SetValue);         
	                                                                                                
	      /***set IO output*/                                                                       
	      HstGpio_Set_Direction(l_eGpioGroup, l_eBit, GPIO_OUPUT);                                  
	                                                                                                
	      /**Write To IO**/ 
		  HstGpio_Set_Value(l_eGpioGroup,l_eBit,l_eData);
	  }else                                            
	  {                                                                                             
	                                                                                                
	  }

	return 0;

}

    完整工程代码下载地址:Hi3520DV300 IO读写应用小程序


(六)路由追踪

路由追踪用来查看网络路由状态,在linux设备中,可以使用traceroute 和tracepath 命令来跟踪路由。在我UbuntuPC端我使用tracepath跟踪我主机到百度的路由如下:

biao@ubuntu:~$ 
biao@ubuntu:~$ 
biao@ubuntu:~$ tracepath www.baidu.com
 1?: [LOCALHOST]                                         pmtu 1500
 1:  192.168.20.254                                        1.425ms 
 1:  192.168.20.254                                        1.733ms 
 2:  10.10.10.254                                          1.997ms 
 3:  10.10.10.254                                          1.522ms pmtu 1492
 3:  100.64.0.1                                           10.884ms 
 4:  113.106.44.49                                         4.968ms asymm  5 
 5:  202.105.158.77                                        4.629ms 
 6:  113.96.4.42                                          11.837ms 
 7:  no reply
 8:  14.29.121.190                                         9.454ms 
 9:  no reply
10:  no reply
11:  no reply
12:  no reply
13:  no reply
14:  no reply
15:  no reply
^C
biao@ubuntu:~$ 

在我一台使用移动物联网卡的设备上运行traceroute,它是4G卡拨号上网的,他的路由情况如下:

~ # 
~ # 
~ # traceroute www.baidu.com
traceroute to www.baidu.com (111.13.100.92), 30 hops max, 38 byte packets
 1  *  192.168.16.17 (192.168.16.17)  177.186 ms  79.267 ms
 2  *  *  *
 3  117.132.190.74 (117.132.190.74)  68.455 ms  51.361 ms  59.812 ms
 4  *  *  *
 5  221.183.38.90 (221.183.38.90)  83.953 ms  87.263 ms  74.621 ms
 6  111.13.98.101 (111.13.98.101)  81.521 ms  111.13.98.93 (111.13.98.93)  77.664 ms  111.13.98.101 (111.13.98.101)  79.678 ms
 7  *  *  111.13.112.57 (111.13.112.57)  418.551 ms
 8  *  *  *
 9  *  *  *
10  *

(七)文件固定位置插入数据

       在文件的固定位置插入固定的数据

#include 
#include 
#include 

#define BASIC_FILE_NAME		"./nandflash.bin"
#define UBOOT_FILE_NAME		"./u-boot.bin"
#define KERNEL_FILE_NAME	"./kernel.bin"
#define ROOTFS_FILE_NAME	"./rootfs.bin"
#define APP_FILE_NAME		"./app.bin"


#define UBOOT_POSITION		0x00
#define KERNEL_POSITION		0x100000
#define ROOTFS_POSITION		0x500000
#define APP_POSITION		0x2700000



int InsertData(FILE *pfBasic,FILE *psInsert,int s32Position)
{
	int l_S32Ret = 0;
	unsigned char l_arru8Temp[1024] = {0xff};
	
	fseek(pfBasic,s32Position,SEEK_SET);
	fseek(psInsert,0,SEEK_SET);
	while(1)
	{
		l_S32Ret = fread(l_arru8Temp,1,1024,psInsert);
		if(l_S32Ret > 0)
		{
			l_S32Ret = fwrite(l_arru8Temp,1,l_S32Ret,pfBasic);
			if(l_S32Ret<=0)
			{
				printf("line %d error l_S32Ret = %d \n",__LINE__,l_S32Ret);
				return -1;
			}
		}else
		{
			break;
		}
	}
	
	return 0;
}



int main(void)
{
	int l_s32Ret = 0;
	FILE *l_pfBasec = NULL;
	FILE *l_pfUboot = NULL;
	FILE *l_pfKernel = NULL;
	FILE *l_pfRootfs = NULL;
	FILE *l_pfApp = NULL;


	l_pfBasec = fopen(BASIC_FILE_NAME,"r+");
	if(NULL==l_pfBasec)
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	l_pfUboot = fopen(UBOOT_FILE_NAME,"r");
	if(NULL==l_pfUboot)
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	l_pfKernel = fopen(KERNEL_FILE_NAME,"r");
	if(NULL==l_pfKernel)
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	l_pfRootfs = fopen(ROOTFS_FILE_NAME,"r");
	if(NULL==l_pfRootfs)
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	l_pfApp = fopen(APP_FILE_NAME,"r");
	if(NULL==l_pfApp)
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	if(0> InsertData(l_pfBasec,l_pfUboot,UBOOT_POSITION))
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	if(0> InsertData(l_pfBasec,l_pfKernel,KERNEL_POSITION))
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	if(0> InsertData(l_pfBasec,l_pfRootfs,ROOTFS_POSITION))
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}

	if(0> InsertData(l_pfBasec,l_pfApp,APP_POSITION))
	{
		printf("line %d error \n",__LINE__);
		goto ERROR;
	}


ERROR:
	if(NULL!=l_pfBasec)
	{
		fclose(l_pfBasec);
		l_pfBasec = NULL;
	}

	if(NULL!=l_pfUboot)
	{
		fclose(l_pfUboot);
		l_pfUboot = NULL;
	}
	
	if(NULL!=l_pfKernel)
	{
		fclose(l_pfKernel);
		l_pfKernel = NULL;
	}
	
	
	if(NULL!=l_pfRootfs)
	{
		fclose(l_pfRootfs);
		l_pfRootfs = NULL;
	}
	
	if(NULL!=l_pfApp)
	{
		fclose(l_pfApp);
		l_pfApp = NULL;
	}
	
	return 0;

}

(七)H264 I帧与P帧偏移

    在H264存储的时候,P帧比I帧存储得快了14帧,需要将所有的P帧往后移动14帧。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  

/************************************************* 
Function:    FindStartCode3  
Description: 判断是否为0x00000001,如果是返回1     
Return: 
Others:
Author: licaibiao
Date:   2017-12-06
*************************************************/
static int FindStartCode3 (unsigned char *Buf)  
{  
	if(Buf[0]!=0 || Buf[1]!=0 || Buf[2] !=0 || Buf[3] !=1) 
	{
		return 0;
	}
	else
	{
		return 1;  
	}	
} 

int read_data(FILE *p_fd,unsigned char* pBuf,int* ps32Len)
{
	int l_s32Pos = 0;
	int l_s32Rewind = -4;
	int l_s32NaluLen = 0;
	unsigned char l_u8FindFlag = 0;
	unsigned char *l_pBuf = NULL;
	l_pBuf = (unsigned char*)malloc (1024*1024*10);
	
	/**从码流中读取4个字节**/
	if (4 != fread (l_pBuf, 1, 4, p_fd))
	{  
		free(l_pBuf);  
		return -1;  
	} 
	
	/**判断是否是00 00 00 01**/
	if(FindStartCode3(l_pBuf))
	{
		l_u8FindFlag = 1;
		l_s32Pos = 4;
	}
	else
	{
		l_u8FindFlag = 0;
		printf("【[%s:%d] start code error  \n", __func__, __LINE__);
		return -1;
	}
	
	/**查找下一个开始字符标志位**/
	l_u8FindFlag = 0;
	while(!l_u8FindFlag)
	{
		/**判断是否到了文件尾**/
		if(feof(p_fd))
		{
			l_s32NaluLen = l_s32Pos - 1;
			memcpy (pBuf, l_pBuf, l_s32NaluLen);
			free(pBuf);
			pBuf = NULL;
			*ps32Len = l_s32NaluLen;
			return -2;
		}
		/**读取一个字节到pBuf 中**/
		l_pBuf[l_s32Pos++] = fgetc(p_fd);
		if(FindStartCode3(&l_pBuf[l_s32Pos-4]))
		{
			l_u8FindFlag = 1;
		}
	}
	
		/**把文件指针指向前一个NALU的末尾 **/
	if (0 != fseek (p_fd, l_s32Rewind, SEEK_CUR))
	{  
		free(l_pBuf);  
		printf("【[%s:%d] GetAnnexbNALU: Cannot fseek in the bit stream file  \n", __func__, __LINE__);
	} 

	l_s32NaluLen = l_s32Pos + l_s32Rewind;
	memcpy(pBuf,l_pBuf,l_s32NaluLen);
	*ps32Len = l_s32NaluLen;
	
	return 0;
}

int main()
{
	unsigned char *l_pBuf = NULL;
	unsigned char *l_pTemp = NULL;
	unsigned char *l_pIFrame = NULL;
	unsigned char *l_pPFrame = NULL;
	unsigned char* l_IPack[30];
	unsigned char* l_PPack[30];
	unsigned int l_ILen[33] = {0};
	unsigned int l_PLen[33] = {0};
	unsigned int i =0;
	unsigned int j =0;
	unsigned int p =0;
	unsigned int l_s32ILen = 0;
	unsigned int l_s32PLen = 0;
	unsigned int l_d = 0;
	int l_s32Ret = 0;
	int l_s32Len = 0;
	
	FILE *l_fpInput = NULL;
	FILE *l_fpOutput = NULL;

    printf("biao debug %d \n",__LINE__);
	l_fpInput = fopen("./001.264","rb");
	if(NULL==l_fpInput)
	{
		printf("open error \n");
		return -1;
	}
	
	l_fpOutput = fopen("./002.h264","w+");
	if(NULL==l_fpOutput)
	{
		printf("open error \n");
		return -1;
	}
	printf("biao debug %d \n",__LINE__);
	l_pBuf = (unsigned char*)malloc (1024*1024*1);
	l_pTemp = (unsigned char*)malloc (1024*1024*1);
	l_pIFrame = (unsigned char*)malloc (1024*1024*1);
	l_pPFrame = (unsigned char*)malloc (1024*1024*1);
	
	for(i=0;i<33;i++)
	{
		l_IPack[i] = (unsigned char*)malloc (500*1024);
		l_PPack[i] = (unsigned char*)malloc (500*1024);	
	}
	i = 0;

	p = 14;
	while(1)
	{
		l_s32Ret = read_data(l_fpInput,l_pBuf,&l_s32Len);
		if(0==l_s32Ret)
		{			
			if(0x61!=l_pBuf[4]) /**I**/
			{
				memcpy(&l_pIFrame[l_s32ILen],l_pBuf,l_s32Len);
				l_s32ILen +=l_s32Len;
				if(0x65==l_pBuf[4])
				{
					printf("write I %d\n",i);
					memcpy(l_IPack[i],l_pIFrame,l_s32ILen);
					l_ILen[i] = l_s32ILen;
					i++;
					l_s32ILen = 0;
				}
			}

			if(0x61==l_pBuf[4]) /**P**/
			{
				memcpy(&l_pPFrame[l_s32PLen],l_pBuf,l_s32Len);
				l_s32PLen +=l_s32Len;
				p++;
				if(0==(p%44))
				{
					printf("write P %d frame=%d l_s32PLen = %d\n",j,p,l_s32PLen);
					memcpy(l_PPack[j],l_pPFrame,l_s32PLen);
					l_PLen[j] = l_s32PLen;
					j++;
					l_s32PLen = 0;
				}
			}
			
		}else
		{
			break;
		}
	}
	
	for(i=0;i

(八)获取本地IP地址

    在linux设备中获取本地IP地址可以使用下面的程序,支持最大主机有三个网口的设备,当然这个网卡数可以修改。

#include 
#include 
#include 
#include 
#include 

int get_local_ip(char *ps8IpList)
{
    struct ifaddrs *ifAddrStruct;
    char l_s8IpAddr[INET_ADDRSTRLEN];
    void *tmpAddrPtr;
    int l_s32IPCount = 0;
    
    getifaddrs(&ifAddrStruct);
    while (ifAddrStruct != NULL) 
    {
        if (ifAddrStruct->ifa_addr->sa_family==AF_INET)
        {
            tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
            inet_ntop(AF_INET, tmpAddrPtr, l_s8IpAddr, INET_ADDRSTRLEN);
            if (strcmp(l_s8IpAddr, "127.0.0.1") != 0) 
            {
                if(l_s32IPCount == 0)
                {
                        memcpy(ps8IpList, l_s8IpAddr, INET_ADDRSTRLEN);
                } else 
                {
                        memcpy(ps8IpList+INET_ADDRSTRLEN, l_s8IpAddr, INET_ADDRSTRLEN);
                }
                l_s32IPCount++;
            }
        }
        ifAddrStruct=ifAddrStruct->ifa_next;
    }

    freeifaddrs(ifAddrStruct);
    return l_s32IPCount;
}

int main()
{
    char l_arrs8IpAddrList[3][INET_ADDRSTRLEN];
    int l_s32AddrCount;
    
    memset(l_arrs8IpAddrList, 0, sizeof(l_arrs8IpAddrList));

    l_s32AddrCount = get_local_ip(*l_arrs8IpAddrList);

    for(l_s32AddrCount;l_s32AddrCount>0;l_s32AddrCount--)
    {
        printf("Server Local IP%d: %s\n",l_s32AddrCount,l_arrs8IpAddrList[l_s32AddrCount-1]);
    }
	
	return 0;
}

 

 

 

 

 

你可能感兴趣的:(工具使用)