void ms_len(long a, char intput[64]) { unsigned long temp3, p1; int i, j; temp3 = 0; p1 = ~(~temp3 << 8); for (i = 0; i < 4; i++) { j = 8 * i; intput[63 - i] = (char)((a & (p1 << j)) >> j); } }这段代码什么意思
时间: 2024-04-25 16:26:30 浏览: 103
这段代码实现了将长整型数a转换为消息长度的函数。SHA-1算法中规定,消息长度需要用64位二进制数来表示,因此需要将长整型数a转换为64位二进制数的形式,存储在长度为64的字符数组input中。
具体来说,代码中的`for`循环将长整型数a的每个字节提取出来,存储在字符数组input中。这里使用了位运算符号`&`和`>>`对长整型数a进行处理,将其转换为字符类型,再存储到字符数组中。
需要注意的是,这段代码中使用了无符号长整型(unsigned long)来存储临时变量。同时,对于位运算操作,使用了左移(`<<`)和右移(`>>`)符号,其中左移操作将无符号长整型数`temp3`进行位扩展,右移操作使用了无符号右移(unsigned right shift)来保证移位后高位为0。
相关问题
//SHA1.c #include <stdio.h> #include <string.h> #include <Windows.h> void creat_w( char input[64],unsigned long w[80]){ int i,j; unsigned long temp,temp1; for(i=0;i<16;i++){ j=4*i; w[i]=((long)input[j])<<24 |((long)input[1+j])<<16|((long)input[2+j])<<8|((long)input[3+j])<<0; } for(i=16;i<80;i++){ w[i]=w[i-16]^w[i-14]^w[i-8]^w[i-3]; temp=w[i]<<1; temp1=w[i]>>31; w[i]=temp|temp1; } } void ms_len(long a,char intput[64]){ unsigned long temp3,p1; int i,j; temp3=0; p1=~(~temp3<<8); for(i=0;i<4;i++){ j=8*i; intput[63-i]=(char)((a&(p1<<j))>>j); } } int main(){ unsigned long H0=0x67452301,H1=0xefcdab89,H2=0x98badcfe,H3=0x10325476,H4=0xc3d2e1f0; unsigned long A,B,C,D,E,temp,temp1,temp2,temp3,k,f; int i,flag; unsigned long w[80]; char input[64]; long x;int n; printf("输入明文:"); scanf("%s",input); n=strlen(input); if(n<57){ x=n*8; ms_len(x,input); if(n==56){ for(i=n;i<60;i++) input[i]=0; } else{ input[n]=128; for(i=n+1;i<60;i++) input[i]=0; } } creat_w(input,w); /*for(i=0;i<80;i++) printf("%lx,",w[i]);*/ printf("\n"); A=H0;B=H1;C=H2;D=H3;E=H4; for(i=1;i < 80;i++){ flag=i/20; switch(flag){ case 0: k=0x5a827999;f=(B&C)|(~B&D);break; case 1: k=0x6ed9eba1;f=B^C^D;break; case 2: k=0x8f1bbcdc;f=(B&C)|(B&D)|(C&D);break; case 3: k=0xca62c1d6;f=B^C^D;break; } /*printf("%lx,%lx\n",k,f); */ temp1=A<<5; temp2=A>>27; temp3=temp1|temp2; temp=temp3+f+E+w[i]+k; E=D; D=C; temp1=B<<30; temp2=B>>2; C=temp1|temp2; B=A; A=temp; printf("第%d步:",i+1); printf("A = %lx,B = %lx,C = %lx,D = %lx,E = %lx\n",A,B,C,D,E); } H0=H0+A; H1=H1+B; H2=H2+C; H3=H3+D; H4=H4+E; printf("\n哈希值:\n"); printf("%lx%lx%lx%lx%lx\n",H0,H1,H2,H3,H4); system("pause"); }写出这段代码每一行的意思
这段代码实现了一个 SHA-1 哈希算法。以下是每一行代码的意思:
```C
#include <stdio.h> // 引入头文件
#include <string.h>
#include <Windows.h>
void creat_w(char input[64], unsigned long w[80]) { // 定义函数 creat_w,用于生成 w 数组
int i, j;
unsigned long temp, temp1;
for (i = 0; i < 16; i++) { // 将 input 依次转为 w 数组
j = 4 * i;
w[i] = ((long)input[j]) << 24 | ((long)input[1 + j]) << 16 | ((long)input[2 + j]) << 8 | ((long)input[3 + j]) << 0;
}
for (i = 16; i < 80; i++) { // 用 w 数组中的元素生成后面的 64 个元素
w[i] = w[i - 16] ^ w[i - 14] ^ w[i - 8] ^ w[i - 3];
temp = w[i] << 1;
temp1 = w[i] >> 31;
w[i] = temp | temp1;
}
}
void ms_len(long a, char intput[64]) { // 将 long 类型 a 转为 char 类型的字符串
unsigned long temp3, p1;
int i, j;
temp3 = 0;
p1 = ~(~temp3 << 8);
for (i = 0; i < 4; i++) {
j = 8 * i;
intput[63 - i] = (char)((a & (p1 << j)) >> j);
}
}
int main() { // 主函数
unsigned long H0 = 0x67452301, H1 = 0xefcdab89, H2 = 0x98badcfe, H3 = 0x10325476, H4 = 0xc3d2e1f0; // 初始值
unsigned long A, B, C, D, E, temp, temp1, temp2, temp3, k, f;
int i, flag;
unsigned long w[80];
char input[64];
long x;
int n;
printf("输入明文:"); // 输入明文
scanf("%s", input);
n = strlen(input);
if (n < 57) { // 填充
x = n * 8;
ms_len(x, input);
if (n == 56) {
for (i = n; i < 60; i++)
input[i] = 0;
}
else {
input[n] = 128;
for (i = n + 1; i < 60; i++)
input[i] = 0;
}
}
creat_w(input, w); // 生成 w 数组
A = H0; B = H1; C = H2; D = H3; E = H4;
for (i = 1; i < 80; i++) { // 迭代计算
flag = i / 20;
switch (flag) {
case 0: k = 0x5a827999; f = (B&C) | (~B&D); break;
case 1: k = 0x6ed9eba1; f = B^C^D; break;
case 2: k = 0x8f1bbcdc; f = (B&C) | (B&D) | (C&D); break;
case 3: k = 0xca62c1d6; f = B^C^D; break;
}
temp1 = A << 5;
temp2 = A >> 27;
temp3 = temp1 | temp2;
temp = temp3 + f + E + w[i] + k;
E = D;
D = C;
temp1 = B << 30;
temp2 = B >> 2;
C = temp1 | temp2;
B = A;
A = temp;
printf("第%d步:", i + 1);
printf("A = %lx,B = %lx,C = %lx,D = %lx,E = %lx\n", A, B, C, D, E);
}
H0 = H0 + A;
H1 = H1 + B;
H2 = H2 + C;
H3 = H3 + D;
H4 = H4 + E;
printf("\n哈希值:\n"); // 输出哈希值
printf("%lx%lx%lx%lx%lx\n", H0, H1, H2, H3, H4);
system("pause");
}
```
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define maxsize 1000 typedef char ElemType; typedef struct { ElemType elem[maxsize]; int last; }SeqList; /*自定义函数说明*/ void InitList(SeqList *L);//初始化顺序表 void CreateFormTail(SeqList *L);//在顺序表中存储各个元素 int Locate(SeqList L,ElemType e);//在顺序表中查找e元素位置 int InsList(SeqList *L,int i,ElemType e);//在顺序表中查第i个元素前插入元素e int DelList(SeqList *L,int i,ElemType *e);//在顺序表中删除第i个元素,并将删除的元素内容通过e带回主函数 void PrintList(SeqList L);//将顺序表中各元素打印输出 bool ListEmpty(SeqList L); /*程序主函数*/ int main() { SeqList L; ElemType e; int temp = -1; int pos = -1; InitList(&L);//初始化顺序表调用 CreateFormTail(&L);//在顺序表中输入大写字母表 PrintList(L);//打印出当前线性表各元素 pos = Locate(L,'F');//在顺序表中查找字符‘F’的位置 printf("F in pos = %d\n",pos);//打印所找字符的逻辑序号 temp = InsList(&L,3,'F');//在顺序表中第三个元素前插入字符‘F’ if(temp == 1) printf("Insert F before i = 3 OK\n");//插入成功打印信息 else printf("Insert Fail\n");//插入失败打印信息 PrintList(L);//打印出插入后当前线性表各元素 DelList(&L,3,&e);//在顺序表中删除第3个元素 printf("Delete i = 3 e = %c\n",e);//打印删除元素信息 PrintList(L);//打印出删除后在当前线性表各元素 return 0; } /*在顺序表中存储各个元素,通过键盘输入元素值,直至读入结束标识符*/ void CreateFormTail(SeqList *L) { int i = 0; char c; int flag = 1;//设置一个标志、初值为1,当输入字符“$”flag为0,建表结束 printf("Creat list,intput A-Z,end by $\n"); while(flag) { c = getchar();//从键盘输入赋值给变量c if(c != '$') { L->elem[i] = c;//将变量c的值赋给结构体中的elem数组 L->last++;//顺序表的长度加一 } else { flag = 0;//输入字符是$,flag置为0,结束 } i++;//数组下标i加1 } } /*初始化顺序表*/ void InitList(SeqList *L) { L->last = 0;//将顺序表的长度初始化为0,表示空表 } /*在顺序表中查找内容为e的元素,如果找到-返回所在逻辑序号,否则未找到返回-1*/ int Locate(SeqList L,ElemType e) { int i = 0;//定义一个变量i赋初值为0 while(i < L.last && L.elem[i] != e)//满足条件i小于顺序表的长度且不等于要查找的元素是,执行循环 i++;//数组下标i自加1 if(i >= L.last) return -1;//历遍完顺序表都没找到元素e,返回-1,表示未找到 else return i + 1;//找到元素e返回逻辑序号 } /*提示:在顺序表中查第i个元素前插入元素e,首先查找顺序表中查第i个元素,如果找到则在该元素之前插入元素e,并提示插入成功-返回OK,否则提示插入失败-返回ERROR*/ int InsList(SeqList *L,int i,ElemType e) { int j; if(i<1||i>L;last+1||L;last==maxsize) return false; i--; for(j=L->length;j>i;j--) L->data[j]=L->data[j-1]; L->data[i]=e; L->length++; return true; } /*提示:在顺序表中删除第i个元素,如果将删除的元素内容通过e带回主函数,提示删除成功-返回OK,否则提示删除失败-返回ERROR*/ int DelList(SeqList *L,int i,ElemType *e) { int j; if(i<1||i>L->length) return false; i--; e=L->data[i]; for(j=i;j<L->length-1;j++) L->data[j]=L->data[j+1]; l->l;length--; return ture; } /*提示:将顺序表中各元素按顺序依次打印输出*/ void PrintList(SeqList L) { for(int i=0;i<L->length;i++) printf("%d",L->data[i]); printf("\n"); }那些代码有错误
你提供的代码中有几个地方存在语法错误或逻辑问题,下面我会逐一指出这些问题并给出修正建议:
### 错误及修复:
1. **`InsList` 函数中的错误:**
```c
int InsList(SeqList *L, int i, ElemType e)
{
int j;
// 这里的条件表达式有错别字和多余的分号
if (i < 1 || i > L->last + 1 || L->last == maxsize)
return ERROR;
i--; // 因为用户传入的i是基于1开始计数的
// 移动数据以腾出空间给新元素
for (j = L->last; j >= i; --j)
L->elem[j + 1] = L->elem[j];
L->elem[i] = e;
++(L->last); // 更新最后一个有效元素的位置
return OK;
}
```
主要是改正了判断条件、去掉了不必要的分号以及正确的处理插入操作。
2. **`DelList` 函数中的错误:**
```c
int DelList(SeqList *L, int i, ElemType *e)
{
if (i < 1 || i > L->last + 1)
return ERROR;
i--;
*e = L->elem[i]; // 获取要删除的元素值
for (; i < L->last - 1; ++i)
L->elem[i] = L->elem[i + 1];
--(L->last);
return OK;
}
```
纠正了一些拼写错误如 `ture` -> `true`, 并且确保删除后的数组元素能正确向前移位。
3. **`PrintList` 函数中的错误:**
```c
void PrintList(SeqList L)
{
for (int i = 0; i <= L.last; ++i)
printf("%c ", L.elem[i]);
printf("\n");
}
```
增加了一个空格使得每个字符间更易区分,并修改循环终止条件为 `<=` 来包含所有的元素(假设 `last` 表示的是最后一位非空槽位)。同时注意到这里的 `%d` 已经改为 `%c` 因为你保存的是字符类型的元素 (`ElemType`)。
4. **其他潜在改进点:**
a. `Locate()` 函数返回的结果应当直接反映逻辑编号而非物理地址。因此应该保持现有的 `return i + 1`.
b. 避免在函数体内使用全局宏定义的最大尺寸限制 (`maxsize`). 最好是在创建列表实例时设定合理的初始容量并且动态管理内存分配。
以下是完整的修订版代码片段:
```c
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 1000
typedef char ElemType;
typedef struct SeqList_t {
ElemType elem[MAXSIZE];
int last; /* The index of the latest element */
} SeqList;
// Function declarations omitted...
/* Insert an element before position i */
int InsList(SeqList *L, int i, ElemType e)
{
int j;
if (i < 1 || i > L->last + 1 || L->last == MAXSIZE)
return ERROR;
i--;
for (j = L->last; j >= i; --j)
L->elem[j + 1] = L->elem[j];
L->elem[i] = e;
++(L->last);
return OK;
}
/* Delete element at position i and set its value to e */
int DelList(SeqList *L, int i, ElemType *e)
{
if (i < 1 || i > L->last + 1)
return ERROR;
i--;
*e = L->elem[i];
while (++i <= L->last)
L->elem[i-1] = L->elem[i];
--(L->last);
return OK;
}
/* Print all elements in sequence list */
void PrintList(const SeqList L)
{
for (int i = 0; i <= L.last; ++i)
printf("%c ", L.elem[i]);
printf("\n");
}
```
---
阅读全文
相关推荐
















