点击上方“小麦大叔”,选择“置顶/星标公众号”

福利干货,第一时间送达

在学习和工作开发的时候,经常需要使用到各种各样不太常用的操作,这种情况一般是自己手动写一些小程序来处理。因为它们不太常用,所以经常用了又没保存,等到下一次在使用的时候又需要重写,这样的非常浪费时间和精力。

所以想在这里统一记录一下,以备下次重新使用。代码以实用为主,如果缺陷,欢迎指出。

1、十六进制字符转整型数字

功能:将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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>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<len; i++, temp=0)  {  // 第一次:i=0, *(str + i) = *(str + 0) = '1', 即temp = 1  // 第二次:i=1, *(str + i) = *(str + 1) = 'd', 即temp = 13  // 第三次:i=2, *(str + i) = *(str + 2) = 'd', 即temp = 14  temp = c2i( *(str + i) );  // 总共3位,一个16进制位用 4 bit保存  // 第一次:'1'为最高位,所以temp左移 (len - i -1) * 4 = 2 * 4 = 8 位  // 第二次:'d'为次高位,所以temp左移 (len - i -1) * 4 = 1 * 4 = 4 位  // 第三次:'e'为最低位,所以temp左移 (len - i -1) * 4 = 0 * 4 = 0 位  bits = (len - i - 1) * 4;  temp = temp << bits;  // 此处也可以用 num += temp;进行累加  num = num | temp;  }  // 返回结果  return num;
}  int main(int argc, char **argv)
{int l_s32Ret = 0;if(2!=argc){printf("=====ERROR!======\n");printf("usage: %s Num \n", argv[0]);printf("eg 1: %s 0x400\n", argv[0]);return 0;}l_s32Ret = hex2dec(argv[1]);printf("value hex = 0x%x \n",l_s32Ret);printf("value dec = %d \n",l_s32Ret);return 0;
}

运行结果:

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

2、字符串转整型

功能:将正常输入的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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>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<strlen((const char *)pstrCmp2);t++){ if(pstrCmp2[t]==pstr[i])uiValue|=(t<<(j++*4));}}else{for(t=0;t<strlen((const char *)pstrCmp1);t++){ if(pstrCmp1[t]==pstr[i])uiValue|=(t<<(j++*4));}}}}else{uiValue=atoi((const char*)strChar);}return uiValue;
}int main(int argc, char **argv)
{int l_s32Ret = 0;if(2!=argc){printf("=====ERROR!======\n");printf("usage: %s Num \n", argv[0]);printf("eg 1: %s 0x400\n", argv[0]);return 0;}l_s32Ret = String2int(argv[1]);printf("value hex = 0x%x \n",l_s32Ret);printf("value dec = %d \n",l_s32Ret);return 0;
}

3、创建文件并填充固定数据

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

/*=============================================================================
#     FileName: CreateFile.cpp
#         Desc: 创建固定大小的文件,然后填充固定的数据
#       Author: Caibiao Lee
#      Version:
#   LastChange: 2018-11-26
#      History:
=============================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>//#define FILL_DATA_VALUE  0xff
#define FILL_DATA_VALUE  0x30 //char 0int 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<len; i++, temp=0)  {  temp = c2i( *(str + i) );  bits = (len - i - 1) * 4;  temp = temp << bits;  num = num | temp;  }  return num;
}  int main(int argc, char **argv)
{FILE *l_pFile = NULL;int  l_s32Rest = 0;unsigned int l_WriteLen = 0;unsigned int l_FileLen = 0;unsigned char TempData[1024] = {FILL_DATA_VALUE};if(3!=argc){printf("usage: %s FileName  FileLen \n ", argv[0]);printf("eg: %s ./Outfile.bin 0x400 \n ", argv[0]);return 0;};const char *l_pFileName = argv[1];if(NULL==l_pFileName){printf("input file name is NULL \n");return -1;}if(('0'==argv[2][0])&&(('X'==argv[2][1])||('x'==argv[2][1]))){l_FileLen = hex2dec(argv[2]);}else{l_FileLen = atoi(argv[2]);}printf("Need To Write Data Len %d \n",l_FileLen);printf("Fill Data Vale = 0x%x \n",FILL_DATA_VALUE);for(int i=0;i<1024;i++){TempData[i] = FILL_DATA_VALUE;}l_pFile = fopen(l_pFileName,"w+");if(l_pFile==NULL){printf("open file %s error \n",l_pFileName);return -1;}while(l_WriteLen<l_FileLen){if(l_FileLen<1024){l_s32Rest = fwrite(TempData,1,l_FileLen,l_pFile);}else{l_s32Rest = fwrite(TempData,1,1024,l_pFile);}if(l_s32Rest <= 0){break;};l_WriteLen +=l_s32Rest; }if(NULL!=l_pFile){fclose(l_pFile);l_pFile = NULL;}return 0;}

运行结果:

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

4、批量处理图片

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

/*=============================================================================
#     FileName: CutFile.cpp
#         Desc: 批量处理,将图片的前面固定字节删除
#       Author: Caibiao Lee
#      Version:
#   LastChange: 2018-11-26
#      History:
=============================================================================*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>#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<l_s8PhotoChannel;j++){for(int i=l_s32PhotoTime;i<235959;i++){memset(l_arrs8InputName,0,sizeof(l_arrs8InputName));sprintf(l_arrs8InputName,"./image/%dY%06d.jpg",j,i);if(0==access(l_arrs8InputName,F_OK)){printf("%s\n",l_arrs8InputName);Cut_file(l_arrs8InputName);    }}}
}

运行结果:

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.jpg2 directories, 54 files
biao@ubuntu:~/test/photo$

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

5、IO控制小程序

嵌入式设备系统一般为了节省空间,一般都会对系统进行裁剪,所以很多有用的命令都会被删除。

在嵌入式设备中要调试代码也是比较麻烦的,一般只能看串口打印。现在写了个小程序,专门用来查看和控制海思Hi3520DV300芯片的IO电平状态。

/*=============================================================================
#     FileName: Hi3520_IO_CTRL.cpp
#         Desc: Hi3520DV300 IO Write and  Read
#       Author: Caibiao Lee
#      Version:
#   LastChange: 2018-11-30
#      History:
=============================================================================*/
#include <stdio.h>
#include <stdlib.h>
#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;}

6、文件固定位置插入数据

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#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  0x2700000int 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;
}

7、获取本地IP地址

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

#include <stdio.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>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;
}

来源:https://caibiao-lee.blog.csdn.net/?type=blog

免责声明:本文来源网络版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

—— The End ——

往期推荐

成为嵌入式高手,少不了这100多个软硬件开源项目

揭秘,嵌入式OTA技术,到底有多复杂?

不看后悔!圈内老手总结的18条嵌入式 C 实战经验

答对10个算我输,示波器基础100问

手把手教你用ESP32 制作一个游戏机,小白可上手

加入嵌入式技术交流群一起进步

点击名片关注我

你点的每个好看,我都认真当成了喜欢

实战总结的7个C程序,好东西不私藏相关推荐

  1. python画完图 程序暂停运行_[Python实战]你也能写的计时器程序

    文章地址:[Python实战]你也能写的计时器程序 上次,公众号介绍了如何使用 Pyqt5 制作猜数游戏界面,并介绍了如何在 Pycharm 中使用 Qt Designer 生成 UI 文件.这次,我 ...

  2. 3.2 Lucene实战:一个简单的小程序

    在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...

  3. 【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)

    发送手机短信验证码 前言 一. 准备工作 二. 配置 三. 实战代码(仅仅是后台代码,前端传入手机号) 总结 前言 在网站和移动应用中利用短信验证码进行信息确认是最常用的验证手段.随着短信验证码的技术 ...

  4. 视频教程-项目实战视频课程:美团小程序(Node.js+Express+支付)-微信开发

    项目实战视频课程:美团小程序(Node.js+Express+支付) 东北大学计算机专业硕士研究生,欧瑞科技创始人&CEO,曾任国内著名软件公司项目经理,畅销书作者,企业IT内训讲师,CSDN ...

  5. 项目实战视频课程:美团小程序(Node.js+Express+支付)-李宁-专题视频课程

    项目实战视频课程:美团小程序(Node.js+Express+支付)-473人已学习 课程介绍         小程序视频教程,本课程实现了美团小程序的核心部分.采用异步的方式,通过AJAX从服务端获 ...

  6. 视频教程-uni-app实战商城类app和小程序-Webapp

    uni-app实战商城类app和小程序 帝莎学院创始人&CEO,目前主要从事全栈开发.Python.PHP.小程序.App.Web等技术的研究和开发.专注于实战类教程,授课风趣幽默,讲解条理清 ...

  7. 【Unity】动作游戏开发实战详细分析-24-流血喷溅程序

    [Unity]动作游戏开发实战详细分析-24-流血喷溅程序 溅落血迹效果 实现思路 利用对象池的代码设计思路,通过随机性来实现随机的溅落血迹效果. 代码 public class DripBloodF ...

  8. 怎么做一个微信小程序卖东西【小程序卖货】

    微信小程序是一个非常方便的平台,很多企业商家都会创建一个微信小程序在线商店来卖东西.以下是一些简单的步骤,以帮助你了解怎么做一个微信小程序卖东西. 一.准备好你的商品等信息 首先准备好你的商品等信息, ...

  9. 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载四(使用程序载入事件)...

    在了解了PhoneGap中都有哪些事件之后,本节将開始对这些事件的使用方法进行具体地介绍.本节要介绍的是程序载入事件,也就是deviceready.pause和resume这3个事件. [范例4-2 ...

  10. yii2实战教程之第一个Yii程序

    作者:白狼 出处:http://www.manks.top/document/yii_first_application.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...

最新文章

  1. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?
  2. Docker 修改镜像源地址
  3. python3菜鸟教程-Python3 入门教程 简单但比较不错
  4. SpringMVC拦截器2(资源和权限管理)(作为补充说明)
  5. 2021.11.18
  6. 频繁项集挖掘之apriori和fp-growth
  7. Swift傻傻分不清楚系列(五) 字符串和字符
  8. mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别
  9. linux emacs命令,Linux Bash Shell 终端 Terminal Emacs 模式 常用 快捷键 命令
  10. vs2017下开发C++MFC动态库实现
  11. Spark SQL 和 Hive UDF ExceptionInInitializerError getRemoteBlockReaderFromTcp BlockReaderFactory
  12. 如何通过索引说数据库优化能力
  13. java中的传参是什么意思_如果作为参数传递,“字符串…参数”是什么意思?...
  14. 开会不要带没用的记事本、笔
  15. ceb2Pdf.exe实现ceb文件转pdf,内网离线安装wine(手动编译32位)实现在centos(linux)上运行window程序exe程序,解决wine : Z:\xxx EXE格式无效
  16. win7安装IIS后如何远程访问IIS
  17. 使用Syncthing文件同步工具在两台Windows server服务器实现文件同步(实战)
  18. python 温度 符号_python中温度单位转换的实例方法
  19. 三维重建(知识点详细解读、主要流程)
  20. 用matlab解根3乘根2,信号与系统第五章习题答案

热门文章

  1. 螺旋桨的制作图文教程
  2. 08-05-09pe_xscan 增加IE版本检测
  3. 没有币如何复制百度文库中的文章
  4. uos专业版与个人版区别_win+Android /wps办公软件官方专业版,内附激活码!
  5. 服务器网站关联数据库,服务器关联数据库
  6. 可用计算机处理的多种信息载体的统称,广西壮族自治区2019-2020学年语文四年级下册第二单元测试卷B卷(6页)-原创力文档...
  7. 中国能源统计年鉴资源网站
  8. java分享微博_Connect/sharing - 微博API
  9. 试卷分析计算机基础,计算机基础试卷分析.doc
  10. 淘淘商城规格参数列表显示