我的 DLL 再次遇到了一个小问题:
我尝试将一个数字(在本例中为“20”)转换为可以写入文件的字符。以哪种方式完成并不重要(无论是否遵循 ascii 表),但我也需要一种转换回来的方法。
这是我的尝试:
file.write((char*)20,3);
但它引发了访问暴力错误..
有人可以告诉我这是如何完成的,以及如何扭转这个过程吗?我还可以使用一种适用于大于 255 的数字的方法,因此结果例如是两个或三个字符(两个字符 = 16 位数字。
有人有想法吗?
如果你只想写一个任意字节,你可以这样做:
file.put(20);
或者
char ch = 20;
file.write(&ch, 1); // Note a higher digit than 1 here will mean "undefined behaviour".
要反转该过程,您可以使用file.get()
or file.read(&ch, 1)
。
对于大于单个字节的单位,您必须使用file.write(...)
,但它的可移植性较差,因为它现在依赖于不同平台之间值的大小相同,并且内部表示是相同的。如果您总是在相同类型的机器(例如 x86 处理器上的 Windows)上运行它,这不是问题,但如果您开始在不同类型的机器(x86、Sparc、 ARM、IBM 大型机、手机 DSP 等),也可能在不同的操作系统之间。
像这样的东西将适用于上述限制:
int value = 4711;
file.write((char *)&value, sizeof(value));
将此值以文本格式写入文件更便于移植,任何其他计算机都可以读取该文件,而不是识别相同的字符编码。
这将unsigned long long
根据数字的大小将 a 转换为多个字符,并将它们输出到文件中。
#include <fstream>
int main() {
unsigned long long number = 2098798987879879999;
std::ofstream out("out.txt");
while (number) { // While number != 0.
unsigned long long n = number & 255; // Copy the 8 rightmost bits.
number >>= 8; // Shift the original number 8 bits right.
out << static_cast<unsigned char>(n); // Cast to char and output.
}
out << std::endl; // Append line break for every number.
}
您可以使用类似这样的方式从文件中读取它
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
int main() {
std::ifstream in("out.txt");
unsigned long long number = 0;
std::string s;
std::getline(in, s); // Read line of characters.
std::reverse(begin(s), end(s)); // To account for little-endian order.
for (unsigned char c : s) {
number <<= 8;
number |= c;
}
std::cout << number << std::endl;
}
这输出
2098798987879879999