欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSAPP基本版实验学习日志:关于hexify代码的阅读以及在ubantu上的运行

程序员文章站 2022-06-29 23:51:36
...

hexify(将命令行上的十六进制数字序列转换为字符串)代码内容:

/* Convert sequence of hex digits on command line into a string, terminated by \n */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    int i;
    for (i = 1; i < argc; i++) {
	unsigned long dig = strtoul(argv[i], NULL, 16);
	putchar((char) dig);
    }
    putchar('\n');
    return 0;
}

下面我将分别解释:

/* Convert sequence of hex digits on command line into a string, terminated by \n */

/ * 符号和 * / 符号:里面内容为C语言的注释,不会被运行,英文意思为将命令行上的十六进制数字序列转换为字符串,以\n结束。

#include <stdio.h>
#include <stdlib.h>

#include<stdio.h>是编译预处理命令,即在程序编译之前要处理的内容,<>中以以“.h ”作为结尾的文件称为头文件,如stdio.h,stdlib.h,string.h均为头文件。
stdio 即 “standard input & output"(标准输入输出)在开头加上#include <stdio.h>即可实现c语言中的 输入函数printf、输出函数scanf等函数。
同样,在开头加上#include <stdlib.h>即可实现c语言中的exitmallocfree等函数。在此程序中用到了它的strtoul函数。
类似的,在开头加上#include <string.h>即可实现关于字符数组的函数,例如连接字符串函数strcat,复制字符串函数strcpy,比较字符串(区分大小写)函数strcmp等。

int main(int argc, char *argv[]) {

程序的主函数,有main()函数的程序才能运行,即函数必须被main()直接或间接调用才能发挥作用,主函数的返回值类型为int(整型)。其中,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。可参考关于main函数参数int main(int argc,char* argv[])详解
C语言还规定argc(第一个形参)必须是整型变量,argv(第二个形参)必须是指向字符串的指针数组。
argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数argv[0]指向程序运行的全路径名,以后的参数为命令行后面跟的用户输入的参数。
通过阅读后续代码,可以发现它利用了这些参数间关系。

	int i;

定义一个整型变量(int),整型变量,在内存中占4个字节,最长能到32位二进制位,其取值为基本整常数,在该定义中,变量名为i。
补充:关于c语言基本数据类型,除了int,还有float,double,char,short,long,可参考c语言基本数据类型short、int、long、char、float、double

	for (i = 1; i < argc; i++) {

for循环语句用来实现当型循环,括号中的表达式1的作用是初始化循环控制变量,即为循环控制变量赋初值;表达式2的作用是给出循环重复执行的判断条件,这个条件也用于决定什么时候结束循环;表达式3的作用是给循环控制变量增值,即定义循环控制变量在每次循环结束后按什么方式变化。
除了for语句,while和do-while语句也是循环语句。关于for语句:C语言for语句用法详解
在此循环中,让i赋初值1,当i < argc时进行循环,每一次循环后由i++令i+1,则i >= argc时结束循环,argc由用户输入参数个数决定,也就是在用户不输入其他参数情况下,循环不进行。

		unsigned long dig = strtoul(argv[i], NULL, 16);

unsigned long,无符号长整型,long在32位机器为4个字节,在64位机器为8个字节,无符号即不会出现负数。定义一个无符号长整型变量(unsigned long),变量名为dig,并为其赋初值 strtoul(argv[i], NULL, 16),其中strtoul是将字符串转换成无符号长整型数,其头文件为stdlib.h。使用该函数即将用户输入的参数argv[i]以16进制的形式转换,再赋给dig。括号中的NULL表示该参数无效,或不使用该参数。
更多关于strtoul可参考:C语言strtoul()函数

		putchar((char) dig);

putchar函数,作用是在屏幕上输出一个字符,基本格式为:putchar( c )。(char) dig表示将变量dig强制转化为字符型(char)。char为字符,字母,数字,汉字均可视为字符。关于字符还有许多拓展知识,可参考Char数据型态。在此程序中为输出dig变量的值。
更多可参考:C语言putchar()函数

	}
	putchar('\n');

输出换行符,即实现回车换行的功能。’\n’是一个转义字符,其余常见转义字符还有’\t’(横向跳到下一制表位置)等。
关于转义字符:C语言字符型数据(字符)

	return 0;
}

主函数返回0表程序结束。
以下为该代码在ubantu上运行结果:

 输入参数:30 31 32 33 34 35 36 37 38 39 输出为:0123456789 

综上,该程序实现的是一种十六进制与字符串之间的转化.它将用户输入的数视为16进制,在进行字符串转化。其中30对应0,31对应1,32对应2…39对应9。

附:标准表

十六进制 缩写/字符 解释
0x00 NUL(null) 空字符
0x01 SOH(start of headline) 标题开始
0x02 STX (start of text) 正文开始
0x03 ETX (end of text) 正文结束
0x04 EOT (end of transmission) 传输结束
0x05 ENQ (enquiry) 请求
0x06 ACK (acknowledge) 收到通知
0x07 BEL (bell) 响铃
0x08 BS (backspace) 退格
0x09 HT (horizontal tab) 水平制表符
0x0A LF (NL line feed, new line) 换行键
0x0B VT (vertical tab) 垂直制表符
0x0C FF (NP form feed, new page) 换页键
0x0D CR (carriage return) 回车键
0x0E SO (shift out) 不用切换
0x0F SI (shift in) 启用切换
0x10 DLE (data link escape) 数据链路转义
0x11 DC1 (device control 1) 设备控制1
0x12 DC2 (device control 2) 设备控制2
0x13 DC3 (device control 3) 设备控制3
0x14 DC4 (device control 4) 设备控制4
0x15 NAK (negative acknowledge) 拒绝接收
0x16 SYN (synchronous idle) 同步空闲
0x17 ETB (end of trans. block) 结束传输块
0x18 CAN (cancel) 取消
0x19 EM (end of medium) 媒介结束
0x1A SUB (substitute) 代替
0x1B ESC (escape) 换码(溢出)
0x1C FS (file separator) 文件分隔符
0x1D GS (group separator) 分组符
0x1E RS (record separator) 记录分隔符
0x1F US (unit separator) 单元分隔符
0x20 (space) 空格
0x21 ! 叹号
0x22 " 双引号
0x23 # 井号
0x24 $ 美元符
0x25 % 百分号
0x26 & 和号
0x27 闭单引号
0x28 ( 开括号
0x29 ) 闭括号
0x2A * 星号
0x2B + 加号
0x2C , 逗号
0x2D - 减号/破折号
0x2E . 句号
0x2F / 斜杠
0x30 0 字符0
0x31 1 字符1
0x32 2 字符2
0x33 3 字符3
0x34 4 字符4
0x35 5 字符5
0x36 6 字符6
0x37 7 字符7
0x38 8 字符8
0x39 9 字符9
0x3A : 冒号
0x3B ; 分号
0x3C < 小于
0x3D = 等号
0x3E > 大于
0x3F ? 问号
0x40 @ 电子邮件符号
0x41 A 大写字母A
0x42 B 大写字母B
0x43 C 大写字母C
0x44 D 大写字母D
0x45 E 大写字母E
0x46 F 大写字母F
0x47 G 大写字母G
0x48 H 大写字母H
0x49 I 大写字母I
0x4A J 大写字母J
0x4B K 大写字母K
0x4C L 大写字母L
0x4D M 大写字母M
0x4E N 大写字母N
0x4F O 大写字母O
0x50 P 大写字母P
0x51 Q 大写字母Q
0x52 R 大写字母R
0x53 S 大写字母S
0x54 T 大写字母T
0x55 U 大写字母U
0x56 V 大写字母V
0x57 W 大写字母W
0x58 X 大写字母X
0x59 Y 大写字母Y
0x5A Z 大写字母Z
0x5B [ 开方括号
0x5C |反斜杠
0x5D ] 闭方括号
0x5E ^ 脱字符
0x5F _ 下划线
0x60 开单引号
0x61 a 小写字母a
0x62 b 小写字母b
0x63 c 小写字母c
0x64 d 小写字母d
0x65 e 小写字母e
0x66 f 小写字母f
0x67 g 小写字母g
0x68 h 小写字母h
0x69 i 小写字母i
0x6A j 小写字母j
0x6B k 小写字母k
0x6C l 小写字母l
0x6D m 小写字母m
0x6E n 小写字母n
0x6F o 小写字母o
0x70 p 小写字母p
0x71 q 小写字母q
0x72 r 小写字母r
0x73 s 小写字母s
0x74 t 小写字母t
0x75 u 小写字母u
0x76 v 小写字母v
0x77 w 小写字母w
0x78 x 小写字母x
0x79 y 小写字母y
0x7A z 小写字母z
0x7B { 开花括号
0x7C l 垂线
0x7D } 闭花括号
0x7E ~ 波浪号
0x7F DEL (delete) 删除