1

我的 DLL 再次遇到了一个小问题:

我尝试将一个数字(在本例中为“20”)转换为可以写入文件的字符。以哪种方式完成并不重要(无论是否遵循 ascii 表),但我也需要一种转换回来的方法。

这是我的尝试:

file.write((char*)20,3);

但它引发了访问暴力错误..

有人可以告诉我这是如何完成的,以及如何扭转这个过程吗?我还可以使用一种适用于大于 255 的数字的方法,因此结果例如是两个或三个字符(两个字符 = 16 位数字。

有人有想法吗?

4

2 回答 2

2

如果你只想写一个任意字节,你可以这样做:

 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));

将此值以文本格式写入文件更便于移植,任何其他计算机都可以读取该文件,而不是识别相同的字符编码。

于 2013-07-19T17:10:43.257 回答
0

这将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
于 2013-07-19T18:04:46.020 回答