小编exe*_*ifs的帖子

多平台方式将std :: wstring写入C++文件中

我一直在努力做一些看起来很简单的事情:将内容写入std :: wstring到磁盘.假设我有以下要写入纯文本文件的字符串:

std::wstring s = L"???."; // random characters pulled from baidu.cn
Run Code Online (Sandbox Code Playgroud)
  1. 使用std::codecvt_utf8或提升语言环境

这是我使用的代码:

std::wofstream out(destination.wstring(), std::ios_base::out | std::ios_base::app);
const std::locale utf8_locale = std::locale(std::locale(), new boost::locale::utf8_codecvt<wchar_t>());
out.imbue(utf8_locale);
// Verify that the file opened correctly
out << s << std::endl;
Run Code Online (Sandbox Code Playgroud)

这在Windows上运行良好,但遗憾的是我在Linux上编译它:codecvt_utf8在通常的发行版提供的编译器上还没有提供,而Boost:Locale只包含在Boost 1.60.0中,这也是一个太近的版本对于发行版的存储库.如果不设置区域设置,则不会向文件写入任何内容(在两个系统上).

  1. 用fwrite

下一次尝试:

FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
fclose(out);
Run Code Online (Sandbox Code Playgroud)

这适用于Windows,但不会在Linux上向该文件写入任何内容.我也尝试以二进制模式打开文件,但这并没有改变任何东西.不设置该ccs部分会导致无法解密的垃圾写入文件.

我显然在这里遗漏了一些东西:将该字符串写入文件的正确方法是什么?

c++ encoding character-encoding

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

方法原型中varargs的多个对象类型?

我正在尝试编写可以使用任意数量的整数和字符串调用的Java函数的原型:

myMethod(1, 2, 3, "Hello", "World"); // Valid call
myMethod(4, "foo", "bar", "foobar"); // Valid call
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望以任何顺序(并且可能混合)给出整数和字符串:

myMethod(1, "Hello", 2, "World", 3); // Valid call
Run Code Online (Sandbox Code Playgroud)

我想过使用varargs,但原型中只能有一个.我的另一个想法是使用以下原型:

public void myMethod(Object ... objs) { [...] }
Run Code Online (Sandbox Code Playgroud)

...但我觉得如果用预期类型以外的东西调用它应该有一个编译错误.当然,instanceof可以执行运行时检查(),但这不是一个非常优雅的解决方案,不是吗?

你会怎么做?

java variadic-functions

13
推荐指数
2
解决办法
8240
查看次数

Java多态性和向下转型

我正在使用Java的反射API,我正在编写检查给定对象并描述其字段,方法等的方法.

我正在使用该getFields()方法迭代不同的属性并显示对象内容:

public static void display(Integer i)
{
    System.out.println("An integer: " + i);
}

// Basically a method for each primitive type wrapper

public static void display(Object o)
{
    for (Field f : c.getFields())
    {
        System.out.println("A " + o.getClass() + " which is composed of:");
        display(f.get(o));
    }
}
Run Code Online (Sandbox Code Playgroud)

(为简单起见,省略了其他原始类型和数组.)

虽然eventhough Fieldget方法返回一个Object,我认为正确的方法将被调用为原始类型包装器(整数,字符串等),但实际上,只display(Object o)调用它(不执行隐式向下转换).

就目前而言,我发现的唯一解决方案是如果可能的话,粗暴地对这些对象进行低估:

public static void display(Object o)
{
    if (o instanceof Integer)
    {
        display((Integer) o);
        return;
    }
    else if (o …
Run Code Online (Sandbox Code Playgroud)

java reflection polymorphism rtti

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

SSL证书固定无法在Android 9上正常工作

我正在使用下面的证书固定代码,该代码已经使用了一段时间(为简便起见,错误处理已被删除):

private static SSLContext _ssl_context = null;

public static SSLSocketFactory get_ssl_socket_factory(Context context)
{
    if (_ssl_context != null) {
        return _ssl_context.getSocketFactory();
    }

    KeyStore keystore = get_keystore(context);
    try
    {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
        tmf.init(keystore);
        _ssl_context = SSLContext.getInstance("TLS");
        _ssl_context.init(null, tmf.getTrustManagers(), null);
        return _ssl_context.getSocketFactory();
    }
    catch (GeneralSecurityException e) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这或多或少是官方文档提供的代码。然后,按如下方式使用SocketFactory:

if ("https".equals(target.getProtocol()) &&
    "example.com".equals(target.getHost()) &&
    huc instanceof HttpsURLConnection)
{
    ((HttpsURLConnection) huc).setSSLSocketFactory(
            SSLHelper.get_ssl_socket_factory(this));
}
Run Code Online (Sandbox Code Playgroud)

当我在Android 8设备上运行此代码时,一切正常。但是,在我的Android 9模拟器上,抛出了一个异常:

E/App: https://example.com/page.html could not be retrieved! (Hostname example.com not verified:
            certificate: sha1/VYMjxowFaRuZpycEoz+srAuXzlU= …
Run Code Online (Sandbox Code Playgroud)

ssl android certificate-pinning

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

连接到 VPN 时 Docker 暴露的端口停止工作

我正在尝试创建一个 Docker 映像,它将通过 VPN 转发端口。我创建了一个公开端口 5144 的简单图像,并测试了它是否正常工作:

sudo docker run -t -d -p 5144:5144 \
                --name le-bridge \
                --cap-add=NET_ADMIN \
                --device=/dev/net/tun \
                bridge
sudo docker exec -it le-bridge /bin/bash
Run Code Online (Sandbox Code Playgroud)

我检查端口是否正确暴露,如下所示:

[CONTAINER] root@6116787b1c1e:~# nc -lvvp 5144
[HOST] user$ nc -vv 127.0.0.1 5144
Run Code Online (Sandbox Code Playgroud)

然后,我输入的任何内容都会在容器的终端中正确回显。但是,一旦我启动 openvpn 守护进程,这就不再起作用:

[CONTAINER] root@6116787b1c1e:~# openvpn logger.ovpn &
[1] 33
Sun Apr  5 22:52:54 2020 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on May 14 2019
Sun Apr  5 22:52:54 2020 library versions: OpenSSL …
Run Code Online (Sandbox Code Playgroud)

openvpn docker

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

序列号在 getChangedPackages API 中是如何工作的?

自 Oreo 以来,引入了一种新方法来弥补阻止应用程序接收PACKAGE_ADDED隐式意图:getChangedPackages

但是,文档并不清楚预期的参数 ( sequenceNumber)到底是什么。据我所知,返回值getChangedPackages是一个ChangedPackages公开getSequenceNumber方法的对象。此外,每次设备启动时,该序列号都应该重置为 0。

这就是我认为应该使用该函数的方式:

  1. 侦听BOOT_COMPLETED意图并将 0 存储在首选项中作为当前序列号。
  2. 每次getChangedPackages调用时,用结果的getSequenceNumber方法更新当前已知的序列号。
  3. 冲洗并重复。

我认为这会起作用,但是为了让 API 可靠地工作而必须检测启动并设置首选项似乎很笨拙。有什么我在这里想念的吗?

android

5
推荐指数
0
解决办法
393
查看次数