我有一个无符号字符向量,我在C ++中复制字节。我将所有原始类型都转换为字节,然后复制到此char向量(在C ++中解释为字节)。现在我也在复制字符串。但是我不确定是否要将字符串转换为字节。如果您在printing the vector
是无符号字符的情况下查看我的输出,我是从double
int
float
打印字节,但是我正在打印变量{的真实字符串{1}}。因此,我想我没有在无符号char的向量上插入此testString
的字节。我应该怎么做?
谢谢
testString
输出:
const std::string lat = "lat->", alt = "alt->", lon = "lon->", testString = "TEST-STRING";
double latitude = 10.123456;
double longitude = 50.123456;
double altitude = 1.123456;
std::vector<unsigned char> result(
sizeof(latitude) + sizeof(longitude) + sizeof(altitude) + testString.length());
std::cout << "copying to the vector" << std::endl;
memcpy(result.data(), &longitude, sizeof(longitude));
memcpy(result.data() + sizeof(longitude), &latitude, sizeof(latitude));
memcpy(result.data() + sizeof(longitude) + sizeof(latitude), &altitude, sizeof(altitude));
memcpy(result.data() + sizeof(longitude) + sizeof(latitude) + sizeof(altitude), testString.c_str(),
testString.length() + 1);
std::cout << "copied to the vector\n" << std::endl;
std::cout << "printing the vector" << std::endl;
for (unsigned int j = 0; j < result.size(); j++) {
std::cout << result[j];
}
std::cout << std::endl;
std::cout << "printed the vector\n" << std::endl;
// testing converting back ...................
std::cout << "printing back the original value" << std::endl;
double dLat, dLon, dAlt;
std::string value;
memcpy(&dLon, result.data(), sizeof(longitude));
memcpy(&dLat, result.data() + sizeof(longitude), sizeof(latitude));
memcpy(&dAlt, result.data() + sizeof(longitude) + sizeof(latitude), sizeof(altitude));
value.resize(testString.length());
memcpy(&value[0], result.data() + sizeof(longitude) + sizeof(latitude) + sizeof(altitude),
sizeof(value.data()) + testString.size());
std::cout << alt << dAlt;
std::cout << lat << dLat;
std::cout << lon << dLon;
std::cout << " " << value << std::endl;
std::cout << "printed back the original value\n" << std::endl;
答案 0 :(得分:4)
您的代码没有问题!您正在打印变量的实际字节。 double
中的字节不能真正解释为文本字符串(至少,如果您这样做则没有意义),但是文本字符串中的字节可以,产生您所看到的。
假设您有以下代码(实际上只是伪装的C):
#include <cstdio>
int main(int argc, char *argv[]) {
struct {
double latitude;
double longitude;
char name[30];
} structure = {
53.6344,
126.5223167,
"Keyboard Mash"
};
printf("%f %f %s\n", structure.latitude, structure.longitude, structure.name);
for (size_t i = 0; i < sizeof(structure); i += 1) {
printf("%c", ((char*)&structure)[i]);
}
printf("\n");
}
此代码将(可能)打印:
53.6344 126.5223167 Keyboard Mash
����������������Keyboard Mash�����������������
前16个字节来自double
,接下来的30个字节来自char[]
。这就是char[]
的存储方式!您的代码正在执行您期望的工作。
当然,您不能完全依靠它来做到这一点。这是不确定的行为。
答案 1 :(得分:1)
我觉得您所期望的是:128565TESTSTRING
,其中12
,85
和65
是经度,纬度和高度的值。好吧,这不会发生是因为您在数据中写入了12
,而不是"12"
;因此,它将返回ASCII码为12
的字符。也许您可以改用sprintf()
之类的东西。