小编mat*_*usa的帖子

处理低级字节操作时reinterpret_cast是否错误?

我正在编写一个websocket服务器,我必须处理需要取消屏蔽的屏蔽数据.

掩码是unsigned char [4],数据也是unsigned char*缓冲区.

我不希望逐字节XOR,我更喜欢一次XOR 4字节.

uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length);
for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) {
    *i ^= mask_;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用reinterpret_cast有什么问题吗?

替代方案是以下代码,它不是那么明确而且不够快:

uint64_t j = 0;
uint8_t *end = data_+length;
for(uint8_t *i = data_; i != end; ++i,++j) {
    *i ^= mask_[j % 4];
}
Run Code Online (Sandbox Code Playgroud)

我很喜欢替代品,包括那些依赖于c ++ 11功能的产品.

c++ casting reinterpret-cast c++11

9
推荐指数
1
解决办法
861
查看次数

OpenSSl RAND_bytes 由于缺乏不可预测性而返回错误的频率如何?

RAND_bytes 的文档声称,如果生成的随机字节是可预测的,该函数可能会返回错误。我的问题是此类错误发生的频率如何?

可以在有限循环中调用 RAND_bytes (例如 5 次尝试),然后抛出异常是解决此问题的合理方法,或多或少像这样:

    unsigned char random_bytes[4];
    uint8_t attempts = 0;
    while(RAND_bytes(random_bytes,sizeof(random_bytes)) != 1 && ++attempts != 5 ) { }
    if( attempts == 5)
    {
        throw std::runtime_error("random bytes too predictable after multiple attempts");
    }
Run Code Online (Sandbox Code Playgroud)

或者这个循环很愚蠢,我应该在第一次尝试后抛出?

谢谢。

c++ openssl

5
推荐指数
1
解决办法
2161
查看次数

将logger.exception更改为level = CRITICAL而不是ERROR?

我需要更改logger.exception默认行为以写入具有level = CRITICAL的记录器.这似乎是我可以改变的东西,但我还没弄明白.我的最后一招是sys.excepthook,但我不想使用它,因为我在那里做格式化.

谢谢!

python

4
推荐指数
1
解决办法
1012
查看次数

如何从 mktime 到 datetime 对象?

我有一个 mktime 想要返回一个 datetime 对象。我想出的最好方法似乎太复杂了:

DateTime::createFromFormat("Y-m-d H:i:s",date("Y-m-d H:i:s",mktime(0, 0, 0, $data[$j]['month'], $data[$j]['day'],$data[$j]['year'])));
Run Code Online (Sandbox Code Playgroud)

有什么更好的方法吗?

php

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

libstdc++ 中 std:shared_ptr 的原子交换如何正确

基于 libstdc++ 的原子交换实现(https://gcc.gnu.org/ml/libstdc++/2014-10/msg00154.html):

看起来静态分配了 16 个互斥锁。当需要发生原子交换时,交换代码会将要交换的 2 个指针散列到这些静态互斥锁、锁和交换中的一个(或两个)。但是,如果一个 shared_ptr 在线程之间共享并且正在被并发访问,那么互斥锁如何帮助保证并发访问和修改的同步?我猜代码假定内部原始指针正确对齐,但这是 x86 规则,而不是 C++ 保证。我缺少什么使交换原子性和正确性而无需为底层原始指针的每次读取额外锁定?

c++ gcc g++ libstdc++ c++11

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

关于指针,双指针,malloc,realloc和new的问题数组(直接设置记录)

我正在赶上指针.我写了几行代码来测试我可以动态分配2d数组的不同方法(在底部发布)

我的问题如下:

  1. 我应该在c ++或new中使用malloc吗?如果我使用new,我仍然可以使用realloc吗?
  2. 我什么时候应该使用realloc?在性能和错误方面使用它有什么含义?
  3. 在下面的例子中,我应该使用哪个对象新版本?如果答案取决于应用程序,它依赖于什么?

非常感谢,马特

#include <stdio.h>
#include <stdlib.h>

struct myObject
{
    int data;
    myObject(int i)
    {
        data = i;
    }
    myObject()
    {
        data = 0;
    }

};

int main(){
    int r = 7;
    int c = 6;

    printf("Objects using NEW===============================\n");
    //notice the triple pointer being assigned a new double pointer array
    myObject*** objectNew = new myObject** [r];

    for(int i=0;i<r;i++)
    {
        //objectNew is a 1D array of double pointers, however if we assign another layer of pointers, it …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers memory-management

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