C语言中的时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的时间相关的知识,希望对你有一定的参考价值。

输入年月日,可知道是星期几。不知道程序哪里错了,求解,谢谢。#include<stdio.h>#include<time.h>#include<string.h>int main()int mon,day,year;struct tm *t;time_t th;printf("请输入年份,月份和日:%A");scanf("%d,%d,%d",&year,&day,&mon);t->tm_sec=0;t->tm_min=0;t->tm_hour=0;t->tm_year=year-1900;t->tm_mday=day;t->tm_mon=mon-1;t->tm_isdst=0;th=mktime(t);t=localtime(&th);printf("这个日子是星期%d%A",t->tm_wday);return 0;

以前实际上用过,很想对C语言中的时间函数了解多一点,趁着这个寒假,查了些资料,大概把我现在能用到的关于时间的操作在此记录下来。通过几个函数来熟悉C语言中对时间的操作。(注:以下程序均在VS2010上编译通过。)①time()函数。可以通过time()函数来获得日历时间。其原型为: time_t time(time_t *timer);一般参数为空,返回值类型time_t是一个长整型数,函数将返回现在的日历时间,即从一个时间点(所有不同版本的Visual C++都是从1970年1月1日0时0分0秒)到现在的经过的秒数。例子程序:#include<stdio.h>#include<time.h>void main() time_t lt; lt=time(NULL); printf("1970年1月1日0时0分0秒到现在经历了%ld秒%A",lt);运行结果(结果与程序运行的时间有关,贴出我此时运行出的结果):1970年1月1日0时0分0秒到现在经历了1326975564秒请按任意键继续. . .②clock()函数。C语言中的计时函数。函数原型为: clock_t clock(void);clock()函数返回从“开启这个程序进程\”到“程序中调用clock()函数”时之间的CPU时钟计时单元数。返回值类型clock_t也是一个长整型数。在time.h头文件中定义了一个符号常量CLOCKS_PER_SEC,表示一秒钟会有多少个计时单元。所以通过简单的数学知识,可以知道在程序中用clock()/CLOCKS_PER_SEC来表示程序从开始到调用clock()函数时用了多少秒。例子程序:#include<stdio.h>#include<time.h>void main() clock_t lt; for(int i=0;i<1000000000;i++); lt=clock(); printf("循环执行1000000000个空操作需要%f秒%A",(double)lt/CLOCKS_PER_SEC);运行结果(在不同的机器上运行的结果可能不一样,下面是在我自己的笔记本上运行的结果):循环执行1000000000个空操作需要3.484000秒请按任意键继续. . .③使用C库函数来显示日期和时间。首先要介绍一下C语言中的一个日期的结构体类型,tm类型。其在time.h中的定义如下:#ifndef _TM_DEFINEDstruct tm int tm_sec; int tm_min; int tm_hour; int tm_mday; int tm_mon; int tm_year; int tm_wday; int tm_yday; int tm_isdst; ;#define _TM_DEFINED#endif然后可以介绍有关的函数了。time.h提供了两种不同的函数将日历时间(一个长整型数)转换成我们平时看到的把年月日时分秒分开的时间格式: struct tm *gmtime(const time_t *timer); struct tm *localtime(const time_t *timer);其中gmtime()函数是将日历时间转换为世界标准时间(即格林尼治时间),并返回一个tm结构体来保存这个时间,而localtime()函数是将日历时间转换为本地时间(在中国地区获得的本地时间会比世界标准时间晚8个小时)。例子程序:#include<stdio.h>#include<time.h>void main() struct tm *local; time_t t; t=time(NULL); local=localtime(&t); printf("现在北京时间是%d点%A",local->tm_hour); local=gmtime(&t); printf("世界标准时间是%d点%A",local->tm_hour);运行结果(运行结果与运行的时间有关,我是在早上9点多钟运行这个程序的):现在北京时间是9点世界标准时间是1点请按任意键继续. . .这样子我们就可以完全才输出此刻的年月日时分秒了,当然需要逐个来输出。其实C库函数还提供了一个很有用的以固定的时间格式来输出年月日时分秒的函数。这两个函数原型如下: char *asctime(const struct tm *timeptr); char *ctime(const time_t *timer);asctime()函数是通过tm结构来生成具有固定格式的保存时间信息的字符串,而ctime()是通过日历时间来生成时间字符串。这样下面的例子程序就容易理解了:#include<stdio.h>#include<time.h>void main() struct tm *local; time_t t; t=time(NULL); local=localtime(&t); printf(asctime(local)); local=gmtime(&t); printf(asctime(local)); printf(ctime(&t));运行结果(我是在早上9点多运行这个程序的):Fri Jan 20 09:55:56 2012Fri Jan 20 01:55:56 2012Fri Jan 20 09:55:56 2012请按任意键继续. . .C语言还可以以我们规定的各种形式来规定输出时间的格式。要用到时可以查阅相关的资料,限于篇幅,就介绍到这里。④这里介绍计算持续的时间长度的函数。之前已经介绍了使用clock()函数的例子,它可以精确到毫秒级。其实我们也可以使用difftime()函数,但它只精确到秒。该函数的定义如下: double difftime(time_t time1,time_t time0);例子程序:#include<stdio.h>#include<time.h>#include<stdlib.h>void main() time_t start,end; start=time(NULL); for(int i=0;i<1000000000;i++); end=time(NULL); printf("这个循-环用了%f秒%A",difftime(end,start));运行结果:这个循环用了3.000000秒请按任意键继续. . .⑤最后介绍mktime()函数。原型如下: time_t mktime(struct tm *timer);可以使用函数将用tm结构表示的时间转换为日历时间。其返回值就是转换后的日历时间。这样我们就可以先制定一个分解时间,然后对这个时间进行操作。下面的例子用来计算2012年1月20日是星期几:#include<time.h>#include<stdio.h>#include<stdlib.h>int main(void) struct tm t; time_t t_of_day; t.tm_year=2012-1900; t.tm_mon=0; t.tm_mday=20; t.tm_hour=0; t.tm_min=12; t.tm_sec=1; t.tm_isdst=1; t_of_day=mktime(&t); printf(ctime(&t_of_day)); return 0;运行结果:Fri Jan 20 00:12:01 2012请按任意键继续. . . 参考技术A “==”在C语言中表示的等于,例如:while(a==0);中,表示,当a等于0时执行下一条语句。否则不执行。用在判断,选择中。

“=”在C语言中表示的赋值。a=b=c=9;用在赋值中。
(仅供参考)
求采纳为满意回答。
参考技术B #include<time.h>
//C语言的头文件
#include<stdio.h>
//C语言的I/O
void
main()

time_t
now;
//实例化time_t结构
struct
tm
*timenow;
//实例化tm结构指针
time(&now);
//time函数读取现在的时间(国际标准时间非北京时间),然后传值给now
timenow
=
localtime(&now);
//localtime函数把从time取得的时间now换算成你电脑中的时间(就是你设置的地区)
printf("Local
time
is
%s\n",asctime(timenow));
//上句中asctime函数把时间转换成字符,通过printf()函数输出

注释:time_t是一个在time.h中定义好的结构体。而tm结构体的原形如下:
struct
tm

int
tm_sec;
int
tm_min;
int
tm_hour;
int
tm_mday;
int
tm_mon;
int
tm_year;
int
tm_wday;
int
tm_yday;
int
tm_isdst;
;

c语言中的openssl aes解密

【中文标题】c语言中的openssl aes解密【英文标题】:openssl aes decryption in c 【发布时间】:2017-11-03 10:13:01 【问题描述】:

我正在尝试使用 php 和 c 创建一个 openssl aes 加密/解密。我能够使用 php 和 openssl 加密文本,这将在 base64 字符串中输出加密字符串。我正在尝试将此base64编码的字符串传递给c程序以使用c中的openssl对其进行解码。

int decrypt(unsigned char *ciphertext,
            int ciphertext_len,
            unsigned char  *key,
            unsigned char *iv,
            unsigned char *plaintext)

    EVP_CIPHER_CTX *ctx;

    int len;

    int plaintext_len;

    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new())) handleErrors();

    if(1 != EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv))
        handleErrors();

    if(1 != EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
        handleErrors();
    plaintext_len = len;


    if(1 != EVP_DecryptFinal_ex(ctx, plaintext + len, &len)) handleErrors();
    plaintext_len += len;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    return plaintext_len;

有什么方法可以在 c 中使用 openssl 解密 base64 字符串吗?我可以使用类似于

的命令行来解密它
openssl enc -aes-256-cbc -d -in file.encrypted -nosalt -nopad -K 31323334353637383132333435363738 -iv 31323334353637383132333435363738

提前致谢

【问题讨论】:

gist.github.com/barrysteyn/4409525 这可能会有所帮助,或者:openssl.org/docs/manmaster/man3/BIO_f_base64.html klutt,谢谢你的回复,解码后我也想用openssl解密 这里是一个使用cbc的例子(不推荐使用)wiki.openssl.org/index.php/… 【参考方案1】:

您正在直接处理 base64 编码数据。 首先,您需要对数据进行 base64 解码以获取实际的加密数据。然后你将应用 AES 解密来获取解密后的数据

BIO *b64, *bmem;
buffer = (char *)malloc(datalength);
b64 = BIO_new(BIO_f_base64());
if(b64 == NULL)


    return NULL;

BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);  
bmem = BIO_new_mem_buf(input, length);
if(bmem == NULL)

    return NULL;

bmem = BIO_push(b64, bmem);
if(bmem == NULL)

    return NULL;


ret = BIO_read(bmem, buffer, length);
if(ret == 0)

    return NULL;

BIO_free_all(bmem);
return buffer;

【讨论】:

谢谢Pras的回复,可以用c解码,之后有什么办法可以用open ssl和c解密吗? @Developers Staff 我已经更新了示例代码,你也可以试试 base64 decode

以上是关于C语言中的时间的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的序列点是啥意思

C语言中的指针和内存泄漏

C语言不定长参数的问题

C语言中的枚举类型有啥用么?

C语言计算时间

C语言中的64位(VC)