我只安装了32位Windows,所以我自己无法验证.
如果我理解正确,在Microsoft API的各个地方使用的DWORD是参考原始的16位字,并且与当前的硬件架构无关?
所以看起来是32位的DWORD,即使我最终编译并链接我的应用程序以在64位Windows中运行,仍将保持32位?或者DWORD会变成128位宽吗?
我想使用OpenSSL库来解密一些AES数据.代码可以访问密钥.这个项目已经使用了libopenssl来做其他事情,所以我想坚持这个库.
我直接查看,/usr/include/openssl/aes.h因为OpenSSL网站对文档很轻松.唯一的解密功能就是这个:
void AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key);
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有办法指定in指针的长度,所以我不确定它是如何工作的.
我认为还有其他一些功能可以用数字参数来区分加密和解密.例如:
void AES_ecb_encrypt(*in, *out, *key, enc);
void AES_cbc_encrypt(*in, *out, length, *key, *ivec, enc);
void AES_cfb128_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb1_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfb8_encrypt(*in, *out, length, *key, *ivec, *num, enc);
void AES_cfbr_encrypt_block(*in, *out, nbits, *key, *ivec, enc);
void AES_ofb128_encrypt(*in, *out, length, *key, *ivec, *num);
void AES_ctr128_encrypt(*in, *out, length, *key, ivec[], ecount_buf[], *num);
void AES_ige_encrypt(*in, *out, …Run Code Online (Sandbox Code Playgroud) 我很困惑,之间的确切关系GetLastError()和errno.它们是相同的数值,还是完全不同的东西?我怎么知道应该检查哪一个?
如果我想将错误代码转换为字符串进行调试,我可以FormatMessageA()互换使用strerror_s()吗?
最后,是否真的WSAGetLastError()总是返回相同的GetLastError(),或者它们都可以返回不同的值?
我有一个C++客户端应用程序,它使用Boost ASIO与各种服务器建立SSL连接.但是对于2个特定服务器,无法建立SSL连接.它挂在电话中boost::asio::ssl::stream::handshake().
我用Wireshark来观察客户端和服务器之间的对话.一个有效的SSL连接似乎这样做:
sslsocket.lowest_layer().connect( endpoint, ec );
C -> SYN -> S
C <- SYN ACK <- S
C -> ACK -> S
sslsocket.handshake( SSLSocket::client, ec );
C -> 209 bytes -> S
C <- 690 bytes <- S
C -> 198 bytes -> S
C <- 415 bytes <- S
Run Code Online (Sandbox Code Playgroud)
...此时ASIO handshake()调用返回表明一切正常,SSL套接字连接正常.
但是对于2个不同的服务器[*],握手看起来像这样:
sslsocket.lowest_layer().connect( endpoint, ec );
C -> SYN -> S
C <- SYN ACK <- S
C -> ACK -> S
sslsocket.handshake( SSLSocket::client, ec …Run Code Online (Sandbox Code Playgroud) 我正在学习在Ubuntu 12.10上第一次使用libusb v1.0.0.这是我用来尝试理解如何使用此API的一些小测试代码:
#include <libusb-1.0/libusb.h>
...
libusb_device **list;
libusb_get_device_list(ctx, &list); // Returns 11 USB devices which is correct.
for (size_t idx = 0; list[idx] != NULL; idx ++)
{
libusb_device *dev = list[idx];
libusb_device_descriptor desc = {0};
int rc = libusb_get_device_descriptor(dev, &desc);
Run Code Online (Sandbox Code Playgroud)
此时,rc == 0,意味着它应该已经成功完成.来源:*libusb_get_device_descriptor()*的文档.
但结构desc总是空的.没有任何字段被设置.如果我将上面的最后两行更改为:
libusb_device_descriptor desc = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int rc = libusb_get_device_descriptor(dev, &desc);
Run Code Online (Sandbox Code Playgroud)
...然后当libusb_get_device_descriptor()返回时,我看到desc保持不变,向我确认我没有得到我对此API的期望.
我还尝试以a.outroot 身份运行,以防万一这需要提升权限.进行谷歌搜索libusb_get_device_descriptor并没有让我到任何地方.
我跑来试试这段代码的相关命令:
sudo …Run Code Online (Sandbox Code Playgroud) 请注意,此函数没有"{"和"}"正文.只是一个try/catch块:
void func( void )
try
{
...
}
catch(...)
{
...
}
Run Code Online (Sandbox Code Playgroud)
这是故意的C++的一部分,还是这是一个g ++扩展?
除了绕过1级{}之外,还有什么目的吗?
在遇到http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html之前,我从未听说过这个.
我继承的类中的构造函数需要传入一个非平凡的对象.类似于:
MyFoo::MyFoo() : SomeBase( complexstuff )
{
return;
}
Run Code Online (Sandbox Code Playgroud)
这complexstuff与之无关MyFoo,所以我不想传递它.
而不是写一些返回的1-off临时函数complexstuff我使用了lambda.我花了几分钟才弄明白的是我必须调用 lambda.所以我的代码现在看起来像这样:
MyFoo::MyFoo() : SomeBase(
[]()
{
/* blah blah do stuff with complexstuff */
return complexstuff;
} () )
{
return;
}
Run Code Online (Sandbox Code Playgroud)
如果你没有抓住它,它是微妙的.但是在lambda体之后,我不得不()告诉编译器立即"运行"lambda.在弄清楚我做错了什么之后才有意义.否则,如果没有()调用lambda,gcc会说类似于:
error: no matching function for call to 'SomeBase(<lambda()>)'
Run Code Online (Sandbox Code Playgroud)
但现在我有想法 - 我这样做了吗?在C++ 11或C++ 14中是否有更好的方法告诉编译器我希望它立即调用我编写的lambda?或者()像我通常的做法那样追加空洞?
如果我并排放两个电话来确定最小的可测量持续时间:
// g++ -std=c++11 -O3 -Wall test.cpp
#include <chrono>
typedef std::chrono::high_resolution_clock hrc;
hrc::time_point start = hrc::now();
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "duration: " << duration.count() << " ns" << std::endl;
Run Code Online (Sandbox Code Playgroud)
我已经在循环中运行了数千次,并且在我特定的3.40GHz桌面上我一直得到40 ns +/- 2 ns.
但是,当我想看看我能睡到的最短时间时:
#include <thread>
hrc::time_point start = hrc::now();
std::this_thread::sleep_for( std::chrono::nanoseconds(1) );
hrc::time_point end = hrc::now();
std::chrono::nanoseconds duration = end - start;
std::cout << "slept for: " << duration.count() << " ns" << std::endl;
Run Code Online (Sandbox Code Playgroud)
这告诉我,我平均睡眠55400纳秒,或55.4微秒.远远超过我的预期.
把上面的代码放到for()循环中,我试着睡不同的数量,这就是结果:
在计算大文件的md5总和时,我看到单个cpu核心跳转到100%,无论多长时间,让所有其他核心空闲.
我对md5的基本理解是整个过程是完全线性的,其中值依赖于所有先前读取的值,并且我们无法做任何事情来使其成为多线程的.这是真的?
或者有没有办法将文件分成几个部分,使用多核计算多个部分的<something>,然后将这些<something>值组合到最终的md5中?
我们用来计算md5sum的库是http://libmd5-rfc.sourceforge.net/但是如果有可能在多个内核中打破md5sum以便更快完成,我会切换到另一个库.
(注意:改为md5以外的东西不是问题,也不能这样做,因为它接口的其他封闭系统.也不是关于使用md5的安全性的问题.)
说我有这些课程:
class Base
{
public:
class Foo { ... };
...
};
Run Code Online (Sandbox Code Playgroud)
然后另一个类派生自基数:
class Derived : public Base
{
// no mention or redefinition of nested class "Foo" anywhere in "Derived"
};
Run Code Online (Sandbox Code Playgroud)
这是否意味着我们现在有一个独特的Derived::Foo,或者Derived::Foo完全相同Base::Foo?
以下是这种情况的一个转折:如果有人抛出一个实例Derived::Foo怎么办?它会在这种情况下被捕获:
catch ( const Base::Foo &ex )
{
// would this also catch an instance of Derived::Foo?
}
Run Code Online (Sandbox Code Playgroud) c++ ×6
c ×3
c++11 ×2
g++ ×2
try-catch ×2
windows ×2
32bit-64bit ×1
aes ×1
boost-asio ×1
c++14 ×1
encryption ×1
errno ×1
getlasterror ×1
inheritance ×1
lambda ×1
libusb ×1
libusb-1.0 ×1
md5 ×1
nested-class ×1
openssl ×1
sockets ×1
ssl ×1
thread-sleep ×1
visual-c++ ×1
win64 ×1
winapi ×1