字节操纵函数

来源:互联网 发布:阿里云备案账号是什么 编辑:程序博客网 时间:2024/05/29 18:23

操作多字节字段的函数有两组,它们既不对数据作解释,也不假设数据是以空字符结束的C字符串。当处理套接字地址结构时,我们需要这些类型的函数,因为我们需要操纵诸如IP地址这样的字段,这些字段可能包含值为0的字节,却不是C字符串。

名字以b(表示字节)开头的第一组函数起源于4.2BSD,几乎所有现今支持套接字函数的系统仍然提供它们。名字以mem(表示内存)开头的第二组函数起源于ANSI C标准,支持ANSI C函数库的所有系统都提供它们。

#include <strings.h>

void bzero(void *dest, size_t nbytes);

void bcopy(const void *src, void *dest, size_t nbytes);

int bcmp(const void *ptrl, const void *ptr2, size_t nbytes);

返回值:若相等则为0,否则为非0

bzero把目标字节串中指定数目的字节置为0。我们经常使用该函数来把一个套接字结构初始化为0bcopy将指定数目的字节从源字节串移到目标字节串。bcmp比较两个任意的字节串,若相同则返回值为0,否则返回值为非0

#include <string.h>

void *memset(void *dest, int c, size_t len);

void *memcpy(void *dest, const void *src, size_t nbytes);

int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);

返回值:若相等则为0,否则为<0>0

memset把目标字节串指定数目的字节置为值cmemcpy类似bcopy,不过两个指针参数的顺序是相反的。当源字节串与目标字节串重叠时,bcopy能够正确处理,但是memcpy的操作结果却不可知。这种情形下必须改用ANSI Cmemmove函数。

记住memcpy两个指针参数顺序的方法之一是记着它们是按照与C中的赋值语句相同的顺序从左到右书写的:

dest = src;

记住memset最后两个参数顺序的方法之一是认识到所有ANSI CmemXXX函数都需要一个长度参数,而且它总是最后一个参数。

memcmp比较两个任意的字节串,若相同则返回0,否则返回一个非0值,是大于0还是小于0则取决于第一个不等的字节:如果ptr1所指字节串中的这个字节大于ptr2所指字节串中的对应字节,那么大于0,否则小于0。我们的比较操作是在假设两个不等的字节均为无符号字符(unsigned char)的前提下完成的。

原创粉丝点击