小编Nor*_*ert的帖子

将Vec <u16>或Vec <WCHAR>转换为&str

我正在进入Rust编程实现一个小程序,我在字符串转换中有点迷失.

在我的程序中,我有一个向量如下:

let mut name: Vec<winnt::WCHAR> = Vec::new(); 
Run Code Online (Sandbox Code Playgroud)

WCHARu16我的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的最佳方法是什么.

string rust

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

在 Python 中的 Paramiko 中强制密码身份验证(忽略 .ssh 文件夹中的密钥)

我正在尝试编写一个小型 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 catchconnect语句周围放置一个块。

然而,我的问题是,我运行该程序的某些系统可以通过存储在~/.ssh. 在这些情况下,连接只会成功(我想避免这种情况)。

那么,问题来了:有人知道强制Paramiko(或其他SSH 客户端)使用密码的方法吗?

谢谢

python ssh paramiko python-3.x

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

有效地比较python中的两个XML文件

我正在尝试找到一种有效的方法来比较两个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文件还包含一些我根本不关心的可选条目.

我考虑了以下解决方案:

  1. 将两个文件解析为DOM树并在循环中对它们进行比较
  2. 将两个文件解析为集合并使用set.difference等运算符
  3. 尝试将一些处理交给一些linux工具,如grep和diff

这里有没有人有这些方法的表现经验,可以指导我走进去的方向吗?

python xml

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

货物始终以"阻止等待构建目录上的文件锁"开头

我最近在我的Windows机器上安装了rustup,并将其作为编辑器集成到Atom中.一切正常,但是一旦我做了cargo run我的项目,Cargo说的第一件事就是:

 Blocking waiting for file lock on build directory
Run Code Online (Sandbox Code Playgroud)

这会在实际编译和运行开始之前将整个过程阻塞大约一分钟.据我所知,之前没有发生这种情况(我在OS X下使用Cargo但没有生锈).

有没有办法禁用它或至少减少超时?

rust rust-cargo

5
推荐指数
2
解决办法
3379
查看次数

分配数据传递给 FFI 调用的正确方法是什么?

讨论/学习了从 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)

ffi rust

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

我应该在 FFI 的上下文中传递可变引用还是转移变量的所有权?

我有一个通过 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)

c-strings ffi widestring rust

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

标签 统计

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