我一直在努力做一些看起来很简单的事情:将内容写入std :: wstring到磁盘.假设我有以下要写入纯文本文件的字符串:
std::wstring s = L"???."; // random characters pulled from baidu.cn
Run Code Online (Sandbox Code Playgroud)
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中,这也是一个太近的版本对于发行版的存储库.如果不设置区域设置,则不会向文件写入任何内容(在两个系统上).
下一次尝试:
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部分会导致无法解密的垃圾写入文件.
我显然在这里遗漏了一些东西:将该字符串写入文件的正确方法是什么?
我正在尝试编写可以使用任意数量的整数和字符串调用的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的反射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 Field的get方法返回一个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) 我正在使用下面的证书固定代码,该代码已经使用了一段时间(为简便起见,错误处理已被删除):
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) 我正在尝试创建一个 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) 自 Oreo 以来,引入了一种新方法来弥补阻止应用程序接收PACKAGE_ADDED隐式意图:getChangedPackages。
但是,文档并不清楚预期的参数 ( sequenceNumber)到底是什么。据我所知,返回值getChangedPackages是一个ChangedPackages公开getSequenceNumber方法的对象。此外,每次设备启动时,该序列号都应该重置为 0。
这就是我认为应该使用该函数的方式:
BOOT_COMPLETED意图并将 0 存储在首选项中作为当前序列号。getChangedPackages调用时,用结果的getSequenceNumber方法更新当前已知的序列号。我认为这会起作用,但是为了让 API 可靠地工作而必须检测启动并设置首选项似乎很笨拙。有什么我在这里想念的吗?
android ×2
java ×2
c++ ×1
docker ×1
encoding ×1
openvpn ×1
polymorphism ×1
reflection ×1
rtti ×1
ssl ×1