小编Sté*_*ane的帖子

64位Windows API:C/C++"DWORD"的大小是多少?

我只安装了32位Windows,所以我自己无法验证.

如果我理解正确,在Microsoft API的各个地方使用的DWORD是参考原始的16位字,并且与当前的硬件架构无​​关?

所以看起来是32位的DWORD,即使我最终编译并链接我的应用程序以在64位Windows中运行,仍将保持32位?或者DWORD会变成128位宽吗?

windows winapi win64 32bit-64bit visual-c++

17
推荐指数
1
解决办法
8538
查看次数

如何使用OpenSSL进行AES解密

我想使用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)

c c++ encryption openssl aes

15
推荐指数
1
解决办法
3万
查看次数

GetLastError(),errno,FormatMessageA()和strerror_s()?

我很困惑,之间的确切关系GetLastError()errno.它们是相同的数值,还是完全不同的东西?我怎么知道应该检查哪一个?

如果我想将错误代码转换为字符串进行调试,我可以FormatMessageA()互换使用strerror_s()吗?

最后,是否真的WSAGetLastError()总是返回相同的GetLastError(),或者它们都可以返回不同的值?

c windows errno getlasterror

15
推荐指数
1
解决办法
7225
查看次数

提升ASIO:SSL握手()永远不会完成

我有一个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)

c++ sockets ssl boost-asio

14
推荐指数
1
解决办法
5659
查看次数

如何使用libusb和libusb_get_device_descriptor()?

我正在学习在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)

c++ libusb libusb-1.0

14
推荐指数
1
解决办法
2万
查看次数

你真的有一个没有身体但只是一个try/catch块的函数/方法吗?

请注意,此函数没有"{"和"}"正文.只是一个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之前,我从未听说过这个.

c++ g++ try-catch

13
推荐指数
3
解决办法
613
查看次数

如何立即调用C++ lambda?

我继承的类中的构造函数需要传入一个非平凡的对象.类似于:

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?或者()像我通常的做法那样追加空洞?

c++ lambda c++11 c++14

13
推荐指数
3
解决办法
5910
查看次数

std :: this_thread :: sleep_for()和纳秒

如果我并排放两个电话来确定最小的可测量持续时间:

// 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()循环中,我试着睡不同的数量,这就是结果:

  • sleep_for(4000 ns)=>睡眠58000 …

g++ thread-sleep c++11

12
推荐指数
2
解决办法
1万
查看次数

md5可以分解为跨多个核心/线程运行吗?

在计算大文件的md5总和时,我看到单个cpu核心跳转到100%,无论多长时间,让所有其他核心空闲.

我对md5的基本理解是整个过程是完全线性的,其中值依赖于所有先前读取的值,并且我们无法做任何事情来使其成为多线程的.这是真的?

或者有没有办法将文件分成几个部分,使用多核计算多个部分的<something>,然后将这些<something>值组合到最终的md5中?

我们用来计算md5sum的库是http://libmd5-rfc.sourceforge.net/但是如果有可能在多个内核中打破md5sum以便更快完成,我会切换到另一个库.

(注意:改为md5以外的东西不是问题,也不能这样做,因为它接口的其他封闭系统.也不是关于使用md5的安全性的问题.)

c md5

11
推荐指数
1
解决办法
2856
查看次数

从基类继承时,嵌套类会发生什么?

说我有这些课程:

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++ inheritance try-catch nested-class

11
推荐指数
1
解决办法
1656
查看次数