我怎么能将bool矢量memcpy到char数组?

时间:2015-09-26 08:03:19

标签: c++ arrays vector

我有两个向量 一个是

std::vector<unsigned char> one_v;

,另一个是

std::vector<bool> outputValuesInBits;

我将值推送到one_v和outputValuesInBits。
两个向量都有两个字节。
one_v [0]和[1]填充了2个字节的数据 outputValuesInBits [0]到[15]填充了2个字节的数据。
现在,我想将(memcpy)数据复制到char数组。

我可以成功地从one_v向量中复制数据,如下所示。

 unsigned char* output = new unsigned char[one_v.size()]();
 memcpy(&output, one_v.data(), 2);

但我无法从outputValuesInBits复制数据。
如果我这样做,

unsigned char* output = new unsigned char[outputValuesInBits.size()/8+1]();
memcpy(&output, outputValuesInBits.data(), 2);

它给了我一个错误

error: invalid use of void expression
     memcpy(&output, outputValuesInBits.data(), 2);

有谁能告诉我如何将bool矢量复制到char数组?

提前谢谢!

3 个答案:

答案 0 :(得分:3)

<?xml version="1.0" encoding="UTF-8" ?> <project name="Ensemble8 JavaFX Demo Application" default="default" basedir="." xmlns:fx="javafx:com.sun.javafx.tools.ant"> <property name="JAVA_HOME" value="/usr/lib/jvm/java-8-oracle"/> <path id="CLASSPATH"> <pathelement location="lib/lucene-core-3.2.0.jar"/> <pathelement location="lib/lucene-grouping-3.2.0.jar"/> <pathelement path="classes"/> </path> <property name="build.src.dir" value="src"/> <property name="build.classes.dir" value="classes"/> <property name="build.dist.dir" value="dist"/> <target name="default" depends="clean,compile"> <taskdef resource="com/sun/javafx/tools/ant/antlib.xml" uri="javafx:com.sun.javafx.tools.ant" classpath="${JAVA_HOME}/lib/ant-javafx.jar"/> <fx:application id="ensemble8" name="Ensemble8" mainClass="ensemble.EnsembleApp"/> <fx:resources id="appRes"> <fx:fileset dir="${build.dist.dir}" includes="ensemble8.jar"/> <fx:fileset dir="lib"/> <fx:fileset dir="${build.classes.dir}"/> </fx:resources> <fx:jar destfile="${build.dist.dir}/ensemble8.jar"> <fx:application refid="ensemble8"/> <fx:resources refid="appRes"/> </fx:jar> <fx:deploy outdir="." embedJNLP="true" outfile="ensemble8" nativeBundles="all"> <fx:application refId="ensemble8"/> <fx:resources refid="appRes"/> <fx:info title="Ensemble8 JavaFX Demo Application" vendor="Oracle Corporation"/> </fx:deploy> </target> <target name="clean"> <mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.dist.dir}"/> <delete> <fileset dir="${build.classes.dir}" includes="**/*"/> <fileset dir="${build.dist.dir}" includes="**/*"/> </delete> </target> <target name="compile" depends="clean"> <javac includeantruntime="false" srcdir="${build.src.dir}" destdir="${build.classes.dir}" fork="yes" executable="${JAVA_HOME}/bin/javac" source="1.8" debug="on" classpathref="CLASSPATH"> </javac> <!-- Copy resources to build.classes.dir --> <copy todir="${build.classes.dir}"> <fileset dir="src/app/resources"/> <fileset dir="src/generated/resources"/> <fileset dir="src/samples/resources"/> </copy> </target> </project> 没有数据成员函数

答案 1 :(得分:2)

我担心你不能以便携的方式。 Cplusplus page on vector说:专业化与非专业化向量具有相同的成员函数,除了data,emplace和emplace_back,这些专业化中没有。这意味着data没有定义在您尝试使用它时解释错误的原因。

如果无法选择可移植性,则没有解决方案,因为存储不一定是bool值的数组,但库实现可能优化存储,以便存储每个值一点点。(强调我的)。我对可能的理解是你甚至不能确定16个布尔值存储在2个连续的字节中:实现必须只为你提供一种方法来使用它们(差不多),好像它们存储在16种不同的布尔值。

如果你忘记了兼容性,你必须找到当前实现的源代码,以了解字节数组的存储位置和方式......但这并不容易......

答案 2 :(得分:1)

至少在g ++编译器中,你可以使用vector :: iterator的_M_p成员,它是指向数据的指针。

示例:

std::vector<bool> vBool(16, false);
vBool[0] = true;
vBool[2] = true;
vBool[13] = true;
std::vector<unsigned char> vChar(2);
unsigned short *ptrUS = reinterpret_cast<unsigned short *>( &(vChar[0]) );
*ptrUS = *reinterpret_cast<unsigned short *>(vBool.begin()._M_p);

std::cout << (unsigned int)vChar[0] << " " << (unsigned int)vChar[1] << "\n";

给出输出&#39; 5 32&#39;,它对应于具有第1和第3位(5)以及第6位(32)的数字。