小编pho*_*594的帖子

C++ 17和十进制浮点的当前状态

C++中十进制浮点的当前状态是什么?我特别关注语言包含,标准合规性和可移植性的状态.

围绕着现有标准(特别是IEEE754-2008),有许多"官方"库浮动,这些标准被认为是标准包含的基础:

此外,有人建议将十进制浮点数添加到C++ 14.根据这篇文章中的提议者,它没有及时提交(见答案评论).

我还检查了许多C++ 17特性的来源,但我找不到提到的十进制浮点数.

我知道有些编译器(例如GCC和Clang)已根据他们认为规范的外观实现了自己的扩展.但是,这些扩展显然无法为尚未正式批准的规范提供全面的支持/可移植性(据我所知).

我们在2017年8月的官方十进制浮点支持位置在哪里?

c++ floating-point language-lawyer c++17

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

使用AES-256和初始化向量进行加密

我有一个关于在AES加密中使用初始化向量的问题.我正在引用以下文章/帖子来为我的程序构建加密:

[1] Java 256位AES密码加密
[2] http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html

我最初是从第一个链接开始关注erickson的解决方案,但据我所知,我的实现不支持PBKDF2WithHmacSHA1.所以,我转向第二个链接,以了解我自己的迭代SHA-256哈希创建.

我的问题在于如何创建IV.一个实现([1])使用Cypher类中的方法来导出IV,而另一个([2])使用散列的第二个16字节作为IV.很简单,为什么差异从安全的角度来看哪个更好?我对IV的推导和使用感到困惑(我理解它们的用途,而不是更微妙的差异),所以任何澄清也是非常受欢迎的.

我注意到第二个链接使用AES-128而不是AES-256,这对我来说,我必须要使用SHA-512才能使用这种方法.这似乎是一个不幸的要求,因为用户的密码必须长16个字符才能确保远程安全哈希并且这个应用程序的目的地是手机.

可根据要求提供来源,但仍未完整.

先感谢您.

java encryption android aes

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

Vim:从任意行重启语法高亮显示

我在Vim语法高亮中发现了一个有趣的边缘情况.请考虑公司Makefile中的以下代码段:

LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT))
Run Code Online (Sandbox Code Playgroud)

上面的行只是删除给定的双引号LDSCRIPT.什么都没有语法错误; make按预期运行,没有问题.

问题

由于上面的行只包含一个双引号,因此突出显示规则错误地认为Makefile正文的其余部分是引用文本并将其作为颜色.对于简单的Makefile,这是一个不便之处; 对于1KLOC + Makefile,这变得非常麻烦(特别是因为这个预处理接近文件的顶部).

问题

有没有办法根据匹配某些给定正则表达式的行(例如.subst[ \t]*['"],.*)或类似的东西禁用语法高亮?如果失败了,有没有办法在保留上面的亮点的同时重启Vim在任意一行的突出显示?

如果可能的话,我想避免编辑Makefile,因为这个脚本在很多部门之间共享.

我愿意写/修改vimscript来达到这个目的,但我之前没有这样做(在任何合理的程度上).任何提示,指示或其他有用的提示将非常感激.

我试过了什么

:syntax sync minlines=1
:syntax sync fromstart
:syntax sync clear
Run Code Online (Sandbox Code Playgroud)

在编辑器中运行时,以上所有内容都不会对突出显示产生任何影响.通过Vim帮助文档,似乎:syn-sync-fourth可能能够做到我所追求的,但是我不确定它将如何以相反的方式起作用(例如,禁用突出显示而不是应用它).

vim makefile syntax-highlighting

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

C++ 11:Modern g ++上的"put_time不是std的成员"

我在新编译器上遇到了一个老问题.尝试使用时打印当前时间std::chrono我收到以下错误:

src/main.cpp:51:30: error: ‘put_time’ is not a member of ‘std’
                 std::cout << std::put_time(std::localtime(&time), "%c") << "\n\n";
                              ^~~
Run Code Online (Sandbox Code Playgroud)

违规片段没什么特别之处:

#include <chrono>
...
auto time = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::cout << std::put_time(std::localtime(&time), "%c") << "\n\n";
Run Code Online (Sandbox Code Playgroud)

这看起来非常像GCC 4.x系列中返回的错误,如同所引用的那样:

这个理论唯一的问题是我的GCC是现代的:

$ g++ --version
g++ (GCC) 6.3.1 20161221 (Red Hat 6.3.1-1)
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11

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

静态变量和线程局部存储

背景:

我发现了一些与多线程静态内存初始化有关的有趣边缘情况.具体来说,我使用的是Howard Hinnant的TZ库,它在许多不同的线程中对我的其余代码工作正常.

现在,我正在开发一个依赖于另一个线程和条件变量的日志类.不幸的是,当我尝试time_point使用date::make_zoned(data::locate_zone("UTC"), tp)库崩溃来格式化计时时.通过挖掘tz.cpp,我发现内部返回的时区数据库正在评估NULL.这一切都来自以下代码段:

tzdb_list&
get_tzdb_list()
{
    static tzdb_list tz_db = create_tzdb();
    return tz_db;
}
Run Code Online (Sandbox Code Playgroud)

可以看出,数据库列表是静态存储的.使用一些printf()和一些时间使用GDB我可以看到从主线程多次调用返回相同的db,但是NULL从我的记录器线程调用时返回.

但是,如果我将声明更改tzdb_list为:

static thread_local tzdb_list tz_db = create_tzdb();
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.这并不奇怪,因为thread_local会导致每个线程完成创建独立实例的繁重工作tzdb_list.显然这会浪费内存,以后很容易引起问题.因此,我真的不认为这是一个可行的解决方案.

问题:

  • 一个线程与另一个线程的调用会导致静态内存的行为有何不同? 如果有的话,我会期望与正在发生的事情相反(例如,线程在初始化内存上"争夺";没有一个接收NULL指针).

  • 返回的静态引用如何可能首先具有多个不同的值(在我的情况下,有效内存与NULL?)?

  • 随着thread_local内置到库中,我在可寻址区域的两端获得了截然不同的内存位置; 为什么? 我怀疑这与线程内存分配的位置与主进程内存有关,但不知道线程分配区域的确切细节.

参考:

我的日志记录线程创建时使用:

outputThread = std::thread(Logger::outputHandler, &outputQueue);
Run Code Online (Sandbox Code Playgroud)

而实际的输出处理程序/库的调用(LogMessage只是一个typedef std::tuple):

void Logger::outputHandler(LogQueue *queue)
{
    LogMessage entry;
    std::stringstream ss;

    while (1)
    {
        queue->pop(entry);           // Blocks on …
Run Code Online (Sandbox Code Playgroud)

c++ static multithreading

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

带有重写的hashCode()和equals()的Java HashMap不返回任何数据

我最近一直在使用Java的HashMap,并且遇到了一些有趣的行为.我目前正在使用它来存储具有多个字段的键/值对象.为此,我重写了hashCode()和equals(),如下所示:

public final class TransitionState {

private String mStackSymbol;
private String mTransitionSymbol;
private int mState;

private static final int HASH_SEED = 7;     //Should be prime
private static final int HASH_OFFSET = 31;

//Constructor and getter methods here

public boolean equals(TransitionState other) {

    //Check that we aren't comparing against ourself
    if (this == other) {
        return true;
    }

    //Check that we are not comparing against null
    if (other == null) {
        return false;
    }

    //Check fields match
    if ((mState == other.getState()) …
Run Code Online (Sandbox Code Playgroud)

java hashmap

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

以离散步骤绘制弧

下午好,

背景
我的问题涉及使用离散步骤在空间中绘制任意弧.然而,它是独一无二的,因为我并没有画出典型意义上的画布.我正在设计的固件是用于CNC铣床的gcode解释器,它将命令转换为步进电机运动.现在,我已经在这个网站上发现了一个类似的问题,但是建议的方法(Bresenham的算法)似乎无法在空间中移动物体,因为它只依赖于计算圆的一个八分圆然后被镜像关于剩余的对称轴.此外,计算两个任意角度之间的弧的规定方法依赖于三角函数(我在微控制器上实现并且希望避免代价高昂的触发功能,如果可能的话)并且根本不采取超出范围的步骤.最后,该算法仅被设计成在一个旋转方向上工作(例如逆时针).

问题
那么,关于实际问题:有没有人知道一种通用算法可用于在离散步骤中"绘制"任意弧,同时仍然给出角度方向(CW/CCW)?最终的实现将在C中完成,但出于问题目的的语言是无关紧要的.

先感谢您.

参考文献
SO使用Bresenham算法绘制一个简单的圆圈:
在离散的xy步骤中"绘制"弧

Wiki页面描述了Bresenham的圆形算法
http://en.wikipedia.org/wiki/Midpoint_circle_algorithm

要实现的Gcode指令(参见.G2和G3)
http://linuxcnc.org/docs/html/gcode.html

language-agnostic algorithm microcontroller drawing

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

在Java中转义SQL字符串

背景:

我目前正在为企业CMS数据库(Business Objects)开发Java前端.目前,我正在构建一个功能,允许用户构建自定义数据库查询.我已经实施了一些措施来确保用户只能使用已批准用户访问的可用列和运算符的子集进行选择(例如,可以选择SI_EMAIL_ADDRESS,而不能使用更强大的字段,如SI_CUID).到目前为止,事情一直在流动,但现在是时候保护此功能免受潜在的SQL注入攻击.

问题:

我正在寻找一种方法来逃避用户输入字符串.我已经看过PerparedStatement,但是我被迫使用第三方API来访问数据库.这些API对我来说是不可变的,直接的数据库访问是不可能的.各个方法接受表示要运行的查询的字符串,从而使PreparedStatement无效(据我所知,必须针对直接数据库连接运行).

我考虑过使用String.replace(),但如果可能的话我不想重新发明轮子.另外,我与开发PerparedStatement的安全专家相去甚远.

我还查看了PerparedStatement的Java API参考,希望找到某种toString()方法.唉,我一直都找不到那种东西.

任何帮助是极大的赞赏.先感谢您.

参考文献:

Java - 转义字符串以防止SQL注入

Java的等价于PHP的mysql_real_escape_string()

java sql business-objects

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

使用Java DOM处理空节点

我有一个关于XML,Java使用DOM和空节点的问题.我目前正在开发一个项目,其中我采用抽象机器的XML描述符文件(用于文本解析)并用它们解析一系列输入字符串.这些抽象机器的实际构建和解释都已完成且工作正常,但我遇到了一个相当有趣的XML要求.具体来说,我需要能够将空的InputString节点转换为空字符串("")并仍然执行我的解析例程.但是,当我尝试从XML树中提取此空白节点时,会出现此问题.这会导致空指针异常,然后通常会发生坏事.这是令人讨厌的XML片段(注意第一个元素是空的):

    <InputStringList>
        <InputString></InputString>
        <InputString>000</InputString>
        <InputString>111</InputString>
        <InputString>01001</InputString>
        <InputString>1011011</InputString>
        <InputString>1011000</InputString>
        <InputString>01010</InputString>
        <InputString>1010101110</InputString>
    </InputStringList>
Run Code Online (Sandbox Code Playgroud)

我使用以下方法从列表中提取字符串:

//Get input strings to be validated
xmlElement = (Element)xmlMachine.getElementsByTagName(XML_INPUT_STRING_LIST).item(0);
xmlNodeList = xmlElement.getElementsByTagName(XML_INPUT_STRING);
for (int j = 0; j < xmlNodeList.getLength(); j++) {

    //Add input string to list
    if (xmlNodeList.item(j).getFirstChild().getNodeValue() != null) {
        arrInputStrings.add(xmlNodeList.item(j).getFirstChild().getNodeValue());

    } else {
        arrInputStrings.add("");

    }
}
Run Code Online (Sandbox Code Playgroud)

我应该如何处理这个空案件?我发现了很多关于删除空白文本节点的信息,但实际上我仍然必须将空白节点解析为空字符串.理想情况下,我想避免使用特殊字符来表示空白字符串.

提前谢谢您的时间.

java xml parsing dom

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

在设备上存储所有数据时创建强密码方案

背景:
我一直在研究一种Android应用程序,它将数据存储在本地数据库中作为我的宠物项目.最近,我决定要密码保护应用程序并加密数据库.现在,我知道在运行中加密数据库的复杂性并且(考虑到我的应用程序的预期使用模式)决定只加密整个数据库文件而不是尝试存储加密的列值等.到目前为止,我已经实现了一个系统,该系统将在每次应用程序启动时或每当用户导航离开我的活动时提示输入密码(以说明用户按下主页键并且应用程序未及时被杀死).

目前,我正在尝试确定如何对密码进行哈希处理以及在何处存储密码.鉴于所有内容都必须存储在设备上,我基本上将密码哈希和盐视为已经泄密,因为任何花了10分钟阅读的人都可以根据给定的设备访问我的数据库/首选项.

鉴于上述假设,我已经开发了我认为仍应提供非常强大的安全性的东西.我希望从社区获得一些反馈,看看我的解决方案是否可行或是否有更好的方法.

我的想法是在应用程序的第一次运行时生成10个不同的随机盐值.这些值将与应用程序首选项(而不是数据库)中的实际最终密码哈希一起存储.请注意,只有一个密码,它用于用户身份验证和数据库解密.每当提出质询时,密码将按如下方式进行散列:

  1. Cleartext密码经过哈希处理.
  2. 散列密码通过用于标准UPC条形码的相同校验和算法运行.这将导致0到9(含)之间的值.
  3. 此校验和数字将用作salt值数组的索引.此单个salt值将附加到当前哈希值.
  4. 然后将对新的散列+ salt值进行散列处理,并重复步骤2-3.

我认为这个过程进行5次迭代会产生5 ^ 10个不同的盐组合,并且应该使任何类型的彩虹攻击几乎不可能.一旦验证了最终散列,就可以使用它来解密数据库.

现在,我意识到这听起来像一个简单的手机应用程序的矫枉过正.它是.但是,这是我的宠物项目,为什么不呢?

问题:
那么,在那段文字之后,这种方法是否合理还是有更好的方法?我认为,有了这个,最薄弱的环节是内存中的攻击还是我弄错了?任何反馈都非常感谢.

先感谢您.

-干杯

java encryption android password-protection

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

C宏创建位域定义

问题

我正在做一些固件编码,并有很多位掩码来管理.到目前为止,我一直在为每个要掩盖的字段重复相同的块,如下所示:

#define LinkStateMask  0x1
#define LinkStateShift 8
#define LinkState(x)  (((x) >> LinkStateShift) & LinkStateMask)
Run Code Online (Sandbox Code Playgroud)

请注意,这些字段通常是多位字段,因此并不总是保证掩码0x1.最终的宏可以很容易地在代码中使用,这是我非常喜欢的:

if( LinkState(temp) == 0 ) {
    // Link is down, return error
    return -ENODEV;
}
Run Code Online (Sandbox Code Playgroud)

问题

有没有办法让C预处理器为我生成这些宏?我知道预处理器只能在一次通过中工作,所以宏不能直接定义另一个,但希望还有另一种方法.

理想情况下,我想写一些类似于以下内容的东西,并使用与上面第二个清单相同的C代码:

BIT_FIELD(LinkState, 8, 0x1)         // BIT_FIELD(name, lsb, mask)
Run Code Online (Sandbox Code Playgroud)

对我来说,关键是在主C文件中保留符号命名的函数式用法,而不必在BIT_FIELD(...)每次需要生成掩码时编写整个调用(其中一些字段被广泛使用,导致维护噩梦).

最后一个限制:我需要的字段稀疏地分散在数百个寄存器中.如果可能的话,我真的想避免struct为每个人定义一个,因为我通常只需要一个或两个字段.

c macros c-preprocessor

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

使用awk删除前导零会产生八进制结果

背景

我有一个简单的问题,对我来说已经消耗了一天的大部分时间.简而言之,我试图从字符串中删除前导零awk. 然而,在大家将此标记为重复之前,问题不在于如何删除前导零(这只是我想要实现的结束).另外,这是特别关于变量的读取; 我很清楚输出操作的格式字符串.

问题

因此我的问题是:每当我尝试将给定变量强制转换为整数时,awk读取前导零并将输入数视为八进制字符串.我有一些简单的例子来演示以下行为:

$ echo "0012" | awk '{$1=$1+0}1'
10
$ echo "0012" | awk '{$1=+$1}1'
10
$ echo "0011" | awk '{print ($1 + 0)}'
9
$ echo "0000" | awk '{$1=$1+0}1'
0
Run Code Online (Sandbox Code Playgroud)

现在,我已经看到许多解决方案提供了各种sed命令来"预处理"并删除前导零.不幸的是,对我来说一个完全有效的输入是0000,哪个基于字符串的解决方案会崩溃为空字符串.

问题

简而言之,awk无论前导零如何,我如何强制将其读取的变量视为十进制?

参考

如何删除除最后一个之外的所有字符

在awk程序中删除前导零

删除awk文件中的前导零

更新

我在原帖中忘记提及的事情:我正在努力合并0000成一个单一的0.此外,我理想的解决方案 - awk仅仅是因为我的环境的纤薄性(嵌入式Linux和桌面操作系统之间).这个awk问题是由BusyBox 1.18.1提供的,但其他一切都应该非常接近Linux的现代桌面版本.

bash shell awk

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

Java和密码强随机数

我一直在使用Java的SecureRandom类来生成盐,以便以后加密和密码哈希(我为每个任务生成单独的盐).我一直在使用的代码如下:

//Init random number generator
secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(System.nanoTime());

//Create salts
secureRandom.nextBytes(bytAuthSalt);
secureRandom.nextBytes(bytEncryptionSalt);
Run Code Online (Sandbox Code Playgroud)

现在,一切都很顺利,直到我开始真正验证我得到的值.对于应用程序的几个连续执行,我的盐是:

[B@43d55dd8
[B@43d55b58
[B@43d55b50
[B@43bd0cc8
[B@43db0b08
[B@43bd0f50
Run Code Online (Sandbox Code Playgroud)

令我感到不安的是,这些数字似乎都是大致顺序的.在网上进行了一些搜索之后,我再次重复运行,而没有自己播种到相同的结果.

我唯一猜测可能导致这种情况的原因在于我正在为Android平台开发.我知道他们有自己的加密提供商,但我没有任何例外.有任何想法吗?

提前致谢.

java encryption android salt

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