分类目录归档: 学习日志

clock()函数的一个坑

clock_t s = clock();

Sleep(5*1000);

printf("%d\n", clock() - s);

这段代码在Windows上大于或等于5秒,但是在Linux上就小于5秒。

查资料发现 标准的应该是 Returns the processor time consumed by the program. 返回程序消耗的处理器时间。

但在MSDN上 Calculates the wall-clock time used by the calling process. 计算调用进程使用的挂钟时间,

注释写的是  The clock function tells how much wall-clock time has passed since the CRT initialization during process start. Note that this function does not strictly conform to ISO C, which specifies net CPU time as the return value. To obtain CPU times, use the Win32 GetProcessTimes function. To determine the elapsed time in seconds, divide the value returned by the clock function by the macro CLOCKS_PER_SEC. 

在Linux上是占用CPU时间,在Windows上是运行时间。所以跨平台的时候就要注意了,不要使用这个函数来做计时。

参考 http://www.51testing.com/html/00/n-3706800.html

OPENSSL AES解密文件遇到的一个小坑

    openssl aes解密需要用到 EVP_CIPHER_CTX_new EVP_DecryptInit_ex EVP_DecryptUpdate EVP_DecryptFinal_ex EVP_CIPHER_CTX_free 五个函数。

默认启用了填充,如果不需要需调用EVP_CIPHER_CTX_set_padding设成0禁用。

在解密大文件的时候需要持续调用EVP_DecryptUpdate来解密,我犯了个错误就是inbuf大小和outbuf大小设成一样,出问题查官方文档才知道outbuf大小要比inbuf大。

EVP_DecryptInit_ex(), EVP_DecryptUpdate() and EVP_DecryptFinal_ex() are the corresponding decryption operations. EVP_DecryptFinal() will return an error code if padding is enabled and the final block is not correctly formatted. The parameters and restrictions are identical to the encryption operations except that if padding is enabled the decrypted data buffer out passed to EVP_DecryptUpdate() should have sufficient room for (inl + cipher_block_size) bytes unless the cipher block size is 1 in which case inl bytes is sufficient.

网上的代码不能乱抄啊!看官方文档的重要性。

https://www.openssl.org/docs/man1.0.2/crypto/EVP_DecryptUpdate.html

https://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption

SQLite数据库修复

最近遇到打开sqlite数据库报"database disk image is malformed"错误,网上Google找的前几个方法都没解决,后找到一个能解决的方法在此记录一下。

//生成sql

sqlite3 data.db .dump > data.sql

//手动检查sql文件,这也是Google前几个方法没提到的,造成后面生成新的数据库为0KB

用编辑器打开刚刚生成的 data.sql 看看文件的最后一行是不是

ROLLBACK; -- due to errors

是则把它删掉,并加上
COMMIT;
如果最后一行是 COMMIT; 则忽略此步骤。

//新建一个数据库,导入sql

sqlite3 new.db < data.sql

//检查

sqlite3 new.db "pragma integrity_check"


参考 https://my.oschina.net/ZntxCYL/blog/535306

go get 命令设置代理

众所周知的原因,使用 go get 下载不了某些开源工程或者非常慢。

网上找了一些办法发现好用,在此做下笔记。

前提是自己有 SS windows客户端。

在控制台分别输入

set http_proxy=http://127.0.0.1:1080
set https_proxy=http://127.0.0.1:1080

端口号看自己的设置,然后用 go get 命令。

LoadLibrary在Win10上的一个坑

LoadLibrary函数在MSDN中有这么一段话

If the string specifies a module name without a path and the file name extension is omitted, the function appends the default library extension .dll to the module name. To prevent the function from appending .dll to the module name, include a trailing point character (.) in the module name string.

也就是LoadLibrary可以加载没有.dll后缀的dll文件,只要在文件后面加个点。

但最近遇到在Windows10系统下面就是败了,GetLastError返回126,至于为什么未知,解决方法就是文件名乖乖加上.dll后缀。