You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rcpp中实现RawVector与std::string的双向转换?

在Rcpp中实现RawVector与std::string的双向转换

在Rcpp-dev社区中有关于如何将字符串转换为RawVector的讨论。

// [[Rcpp::export]]
RawVector say_hello()
{
    std::string res = "hello friend";
    RawVector raw( res.size() ) ;
    std::copy( res.begin(), res.end(), raw.begin() ) ;
    return raw ;
}

该代码运行符合预期:

> Rcpp::sourceCpp( paste0(wd, "src/base64.cpp") );
> say_hello()
 [1] 68 65 6c 6c 6f 20 66 72 69 65 6e 64
> charToRaw("hello friend")
 [1] 68 65 6c 6c 6f 20 66 72 69 65 6e 64

问题:如何在Rcpp中实现反向转换?

如果我有一个RawVector,如何将其转换为std::string?也就是在Rcpp中实现R语言里rawToChar函数的功能?

> rawToChar ( charToRaw("hello friend") )
[1] "hello friend"

说明

类比上述rawToChar和charToRaw的代码,我希望实现:print_hello(say_hello()),其输出应为"hello friend"。

即我尝试从R传入一个raw向量,并在Rcpp中将其转换为std::string:

失败尝试一

// [[Rcpp::export]]
std::string print_hello(const RawVector& raw)
{   
    // 尝试参考字符向量转std::string的方法
    std::string res = Rcpp::as<std::string>(raw);
    return res ;
}

失败尝试二(目标格式)

此处引入了Rcpp序列化API:#include "RApiSerializeAPI.h"

#include "RApiSerializeAPI.h"
std::string print_hello(const RawVector raw)
{   
    std::string res = unserializeFromRaw(raw);
    return res ;
}

错误信息:

base64.cpp:155:38: error: conversion from 'SEXP' {aka 'SEXPREC*'} to non-scalar type 'std::string' {aka 'std::__cxx11::basic_string<char>'} requested
  155 |  std::string res = unserializeFromRaw(raw);

最后一次尝试,同样失败

std::string print_hello(SEXP s)
{   
    Rcpp::RawVector raw = (TYPEOF(s) == RAWSXP) ? s : serializeToRaw(s);
    std::string res = unserializeFromRaw(raw);
    return res ;
}

我还尝试过参考static_cast相关内容,但不太理解。我的核心目标就是:将RawVector转换为std::string,现在陷入了困境。

Windows环境信息

/*
g++ -std=gnu++11  -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG   -I"C:/Users/......./AppData/Local/R/WIN-LI~1/4.2/Rcpp/include" -I"C:/_git_/github/......./src" -I"C:/_git_/github/......./inst/include"   -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include"     -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c base64.cpp -o base64.o


R_RTOOLS42_PATH                             
C:\rtools42/x86_64-w64-mingw32.static.posix/bin;C:\rtools42/usr/bin

"pkg.version(Rcpp)"
[1] ‘1.0.9’


> R.version
               _                                
platform       x86_64-w64-mingw32                
arch           x86_64                            
os             mingw32                          
crt            ucrt                             
system         x86_64, mingw32                   
status                                          
major          4                                
minor          2.1                              
year           2022                             
month          06                               
day            23                               
svn rev        82513                            
language       R                                
version.string R version 4.2.1 (2022-06-23 ucrt)
nickname       Funny-Looking Kid  
*/

Dirk的解答结果

> r = (charToRaw("The quick brown fox"))
> r
 [1] 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f 78
> r2c(r)
[1] "The quick brown fox"

> r2c(charToRaw("The quick brown fox"))
[1] "The quick brown fox\xd2\xce\002"

### 令人困惑 ### Windows系统问题?

> r <- charToRaw("The quick brown fox")
> r2c(r)
[1] "The quick brown fox\xdb\xce\002"
> r = (charToRaw("The quick brown fox"))
> r2c(r)
[1] "The quick brown fox"

内容的提问来源于stack exchange,提问作者mshaffer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:05:36