我正在进入Rust编程实现一个小程序,我在字符串转换中有点迷失.
在我的程序中,我有一个向量如下:
let mut name: Vec<winnt::WCHAR> = Vec::new();
Run Code Online (Sandbox Code Playgroud)
WCHAR与u16我的Windows机器上的相同.
我Vec<u16>将一个C函数(作为指针)移交给数据填充它.然后我需要将向量中包含的字符串转换为 &str.但是,无论我尝试什么,我都无法让这种转换工作.
我设法工作的唯一方法是将其转换为WideString:
widestr = unsafe { WideCString::from_ptr_str(name.as_ptr()) };
Run Code Online (Sandbox Code Playgroud)
但这似乎是走向错误方向的一步.
在假设向量包含有效且以null结尾的字符串Vec<u16>的情况&str下,将此转换为a的最佳方法是什么.
我正在尝试编写一个小型 Python 程序来检查 SSH 服务器是否允许密码身份验证。这是目前的计划:
import base64
import paramiko
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('ssh.example.com', username='strongbad', password='thecheat')
stdin, stdout, stderr = client.exec_command('ls')
for line in stdout:
print('... ' + line.strip('\n'))
client.close()
Run Code Online (Sandbox Code Playgroud)
这个想法是 grep 输出或稍后try catch在connect语句周围放置一个块。
然而,我的问题是,我运行该程序的某些系统可以通过存储在~/.ssh. 在这些情况下,连接只会成功(我想避免这种情况)。
那么,问题来了:有人知道强制Paramiko(或其他SSH 客户端)使用密码的方法吗?
谢谢
我正在尝试找到一种有效的方法来比较两个XML文件并处理python脚本中的差异.场景是我有两个类似于以下的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<garage>
<car>
<color>red</color>
<size>big</size>
<price>10000</price>
</car>
<car>
<color>blue</color>
<size>big</size>
<price>10000</price>
<!-- [...] -->
<car>
<color>red</color>
<size>big</size>
<price>11000</price>
</car>
</car>
</garage>
Run Code Online (Sandbox Code Playgroud)
这些XML文件包含数千个小对象.文件本身大小约为5 MB.棘手的是,这两个文件中只有极少数条目不同,我只需要处理不同的信息.换句话说:我需要有效地(!)找出哪些条目已更改或已添加.不幸的是,XML文件还包含一些我根本不关心的可选条目.
我考虑了以下解决方案:
这里有没有人有这些方法的表现经验,可以指导我走进去的方向吗?
我最近在我的Windows机器上安装了rustup,并将其作为编辑器集成到Atom中.一切正常,但是一旦我做了cargo run我的项目,Cargo说的第一件事就是:
Blocking waiting for file lock on build directory
Run Code Online (Sandbox Code Playgroud)
这会在实际编译和运行开始之前将整个过程阻塞大约一分钟.据我所知,之前没有发生这种情况(我在OS X下使用Cargo但没有生锈).
有没有办法禁用它或至少减少超时?
在讨论/学习了从 Rust 调用 Windows-API 的 FFI 的正确方法之后,我进一步研究了它,并想仔细检查我的理解。
我有一个被调用两次的 Windows API。在第一次调用中,它返回实际输出参数所需的缓冲区大小。然后,使用足够大小的缓冲区第二次调用它。我目前正在使用 aVec作为此缓冲区的数据类型(请参见下面的示例)。
该代码可以工作,但我想知道这是否是正确的方法,或者是否最好利用一个函数,例如alloc::heap::allocate直接保留一些内存,然后用于 transmute将 FFI 的结果转换回来。同样,我的代码可以工作,但我试图在幕后了解一下。
extern crate advapi32;
extern crate winapi;
extern crate widestring;
use widestring::WideCString;
use std::io::Error as IOError;
use winapi::winnt;
fn main() {
let mut lp_buffer: Vec<winnt::WCHAR> = Vec::new();
let mut pcb_buffer: winapi::DWORD = 0;
let rtrn_bool = unsafe {
advapi32::GetUserNameW(lp_buffer.as_mut_ptr(),
&mut pcb_buffer )
};
if rtrn_bool == 0 {
match IOError::last_os_error().raw_os_error() {
Some(122) => {
// Resizing the buffers sizes …Run Code Online (Sandbox Code Playgroud) 我有一个通过 C FFI(通过 winapi-rs)使用 Windows API 的程序。其中一个函数需要一个指向字符串的指针作为输出参数。该函数将其结果存储到此字符串中。我正在WideCString为此字符串使用类型变量。
我可以“只是”将一个可变引用传递给一个字符串引用到这个函数中(在一个不安全的块内),还是我应该使用类似的功能.into_raw()并且.from_raw()也将变量的所有权移动到 C 函数?
两个版本都可以编译和工作,但我想知道我是否购买了直接方式的任何缺点。
这是我的代码中使用.into_raw和的相关行.from_raw。
let mut widestr: WideCString = WideCString::from_str("test").unwrap(); //this is the string where the result should be stored
let mut security_descriptor_ptr: winnt::LPWSTR = widestr.into_raw();
let rtrn3 = unsafe {
advapi32::ConvertSecurityDescriptorToStringSecurityDescriptorW(sd_buffer.as_mut_ptr() as *mut std::os::raw::c_void,
1,
winnt::DACL_SECURITY_INFORMATION,
&mut security_descriptor_ptr,
ptr::null_mut())
};
if rtrn3 == 0 {
match IOError::last_os_error().raw_os_error() {
Some(1008) => println!("Need to fix this errror in get_acl_of_file."), // Do nothing. No …Run Code Online (Sandbox Code Playgroud) rust ×4
ffi ×2
python ×2
c-strings ×1
paramiko ×1
python-3.x ×1
rust-cargo ×1
ssh ×1
string ×1
widestring ×1
xml ×1