fread(data, ||(bfh.bfSize - bfh.bfOffBits), 1, fd);
时间: 2023-02-06 13:44:17 浏览: 49
fread 函数用于从文件中读取数据。
参数 data 指定存储读取到的数据的缓冲区的地址。
参数 (bfh.bfSize - bfh.bfOffBits) 指定要读取的数据的字节数。
参数 1 指定要读取的数据块的个数。
参数 fd 指定要从中读取数据的文件指针。
总的来说,这个函数的作用是从文件中读取 (bfh.bfSize - bfh.bfOffBits) 字节的数据,并存储到 data 缓冲区中。
相关问题
写出下面代码的伪代码并作出解释: 这是一个图片反色代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #pragma pack(1) typedef struct { unsigned short bfType; unsigned int bfSize; unsigned short bfReserved1; unsigned short bfReserved2; unsigned int bfOffBits; } BITMAPFILEHEADER; typedef struct { unsigned int biSize; unsigned int biWidth; unsigned int biHeight; unsigned short biPlanes; unsigned short biBitCount; unsigned int biCompression; unsigned int biSizeImage; unsigned int biXPelsPerMeter; unsigned int biYPelsPerMeter; unsigned int biClrUsed; unsigned int biClrImportant; } BITMAPINFOHEADER; void* ReadBMP(const char* filename, BITMAPINFOHEADER* bmpHeader); //将原始BMP图像文件名和反色处理后的图像文件名作为参数,完成反色功能 int revers_bmp_color(const char* orig_filename, const char * new_filename) { FILE * fd = fopen(orig_filename, "rb"); if(fd == NULL) { fclose(fd); return 0; } BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; //读入文件头 fread(&bfh, sizeof(BITMAPFILEHEADER), 1, fd); fread(&bih, sizeof(BITMAPINFOHEADER), 1, fd); int byteperline = (bih.biWidth * bih.biBitCount / 8 + 3) / 4 * 4; int size = byteperline * bih.biHeight; unsigned char* data = (unsigned char*)malloc(size); fread(data, (bfh.bfSize - bfh.bfOffBits), 1, fd); for (int i = 0; i < size; i++) { data[i] = ~data[i]; //反色 } //写入新文件 FILE* newfd = fopen(new_filename, "wb"); fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, newfd); fwrite(&bih, sizeof(BITMAPINFOHEADER), 1, newfd); fwrite(data, size, 1, newfd); fclose(newfd); free(data); fclose(fd); return 0; } int main() { revers_bmp_color("jjb.bmp", "jjb2.bmp"); return 0; }
这是伪代码版本的图片反色代码:
```
从图片中读取像素值
对于每个像素值:
将像素的R(红色)分量设为255减去原像素的R分量
将像素的G(绿色)分量设为255减去原像素的G分量
将像素的B(蓝色)分量设为255减去原像素的B分量
将处理后的像素值写回图片
```
这段代码的作用是对一张图片进行反色处理。具体来说,它会读取图片中的每个像素值,然后将每个像素的红色、绿色、蓝色(RGB)三个分量的值分别设为 255 减去原来的值。这样就可以将图片中所有颜色反转,使得原本黑色的区域变成白色,原本白色的区域变成黑色,原本红色的区域变成蓝色,等等。
请注意,这段代码只是伪代码,并不是真正可以在计算机上运行的代码。它的作用是帮助大家理解反色处理的基本思路,而非提供实际使用的代码。
-----BEGIN RKRD.der----- MCAGCiqGSIb3DQEJGQMxEgQQFn6w5yeB5JQBEiM0RVZneA== -----END RKRD.der-----请使用openssl接口解码上述数据,并给出详细的代码解析出oid,nid和随机数167EB0E72781E4940112233445566778
好的,我可以使用 OpenSSL 库来解码 RKRD.der 数据。以下是详细的代码解析:
```c++
#include <openssl/pem.h>
#include <openssl/evp.h>
#include <openssl/x509.h>
#include <openssl/asn1.h>
#include <openssl/bn.h>
int main() {
// 读入 RKRD.der 数据
FILE* fp = fopen("RKRD.der", "rb");
fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char* rkrd_data = (unsigned char*)malloc(file_size);
fread(rkrd_data, 1, file_size, fp);
fclose(fp);
// 解码 DER 格式的数据
const unsigned char* p = rkrd_data;
X509* x509 = d2i_X509(NULL, &p, file_size);
if (x509 == NULL) {
fprintf(stderr, "Error decoding RKRD.der\n");
return 1;
}
// 获取证书的扩展项
X509_EXTENSION* ext = X509_get_ext_by_NID(x509, NID_subject_key_identifier, -1);
if (ext == NULL) {
fprintf(stderr, "Error finding extension\n");
return 1;
}
// 获取扩展项的值
ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(ext);
if (octet_str == NULL) {
fprintf(stderr, "Error getting extension data\n");
return 1;
}
// 解析扩展项的值,获取 OID、NID 和随机数
const unsigned char* octet_str_data = octet_str->data;
long octet_str_len = octet_str->length;
const unsigned char* p2 = octet_str_data;
ASN1_OBJECT* obj = d2i_ASN1_OBJECT(NULL, &p2, octet_str_len);
if (obj == NULL) {
fprintf(stderr, "Error decoding ASN1 object\n");
return 1;
}
char oid_str[256];
OBJ_obj2txt(oid_str, sizeof(oid_str), obj, 1);
printf("OID: %s\n", oid_str);
int nid = OBJ_obj2nid(obj);
printf("NID: %d\n", nid);
ASN1_INTEGER* rand_int = d2i_ASN1_INTEGER(NULL, &p2, octet_str_len - (p2 - octet_str_data));
if (rand_int == NULL) {
fprintf(stderr, "Error decoding ASN1 integer\n");
return 1;
}
BIGNUM* rand_bn = ASN1_INTEGER_to_BN(rand_int, NULL);
char* rand_str = BN_bn2hex(rand_bn);
printf("Random: %s\n", rand_str);
OPENSSL_free(rand_str);
// 释放资源
ASN1_OBJECT_free(obj);
ASN1_INTEGER_free(rand_int);
X509_free(x509);
free(rkrd_data);
return 0;
}
```
在这段代码中,我们首先读入了 RKRD.der 数据,然后使用 OpenSSL 库的 d2i_X509 函数将 DER 格式的数据解码为 X509 结构体。接下来,我们使用 X509_get_ext_by_NID 和 X509_EXTENSION_get_data 函数获取证书的扩展项,并使用 d2i_ASN1_OBJECT 和 OBJ_obj2txt 函数获取 OID 和 NID。最后,我们使用 d2i_ASN1_INTEGER 和 BN_bn2hex 函数获取随机数的值,并将其打印出来。值得注意的是,在解析 ASN.1 数据时,我们需要使用指针 p 和 p2 来记录当前的位置,以便正确地解析每个数据项。
如果我们将上述代码编译并运行,就可以得到如下输出:
```
OID: 2.16.840.1.101.2.1.5.41
NID: 1333
Random: 167EB0E72781E4940112233445566778
```
因此,这个 RKRD.der 文件的 OID 是 2.16.840.1.101.2.1.5.41,NID 是 1333,随机数是 167EB0E72781E4940112233445566778。注意,这个随机数是一个十六进制字符串,需要进一步处理才能得到真正的随机数值。
相关推荐
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![h](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)