我有一个包含十六进制值的字符串:
string str = "e101";
我需要将此文件写为2个字节。当我尝试写入文件时,它将像以下4个字节的值那样写入:
65 31 30 31
我正在使用以下操作进行文件写入:
myfile.open ("file.cf3",std::ios::binary);
myfile << str << "\n";
myfile.close();
但是我想将其写为2个字节的值。
例如,如果我要如何将其作为2个字节写入文件?
std::string wut="b6306edf953a6ac8d17d70bda3e93f2a3816eac333d1ac78";
我想要类似的输出
.0n..:j..}p...?*8...3..x
答案 0 :(得分:1)
这是解决方案的示例。
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ofstream file("file.txt", std::ios::binary);
if(!file.is_open()) {
return -1;
}
std::string str("e101");
for (std::size_t i = 0; i < str.length() - 1; ++++i) {
file << static_cast<char>(str[i] * 16 + str[i + 1]);
}
file.close();
}
您可以简单地遍历字符串并将两个字符作为一个字节。您将第一个字符乘以16,然后添加第二个字符。
答案 1 :(得分:1)
我认为您的问题模棱两可... 请记住,从您的字符串开始,每两个字符都有1个字节(不是两个)。 因此,您要写两个数字(表示ASCII)代表字符串的十六进制值... 如果这是正确的解释,则需要将字符串分成多个字符对,然后将每个字符转换为等效的整数。 这是我的代码... 它会写到stdout,但是您可以轻松地对其进行修改,以便将其写入文件而不是写入屏幕。
implementation "android.arch.core:core-testing:1.0.0"
答案 2 :(得分:0)
要回答有关将二进制文件中的2字节写入C ++中文件的原始问题,您有一个基本的两步过程。 (1)使用以stoi
为底的16
将数字的字符串表示形式转换为数值。这提供了可以存储在unsigned short
中的数值。 (2)使用f.write
而不是frwite
将该值写到文件中,其中f
是您的开放流引用。
如果要为cout
以十六进制格式设置输出格式,则必须为cout
设置标志以以十六进制格式输出数值(尽管不是问题的直接组成部分,它还是有关系的)在流I / O格式(如果需要)中。)
因此,基本上,您拥有字符串并将其转换为数字,例如
std::string str = "e101";
unsigned short u = stoi(str, 0, 16);
现在u
保留一个使用{em> base-16 从str
中的文本转换而来的数值,您可以简单地将其写为2字节的值,例如
std::string filename = "out.bin"; /* output filename */
...
std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) { /* write 2 bytes */
std::cerr << "error: write of short to file failed.\n";
return 1;
}
将其完全放在一起,您可以做一些简短的操作,例如输出用cout
写入的十六进制值,以及将其写入文件"out.bin"
的
#include <fstream>
#include <iostream>
#include <iomanip>
#include <string>
int main (void) {
std::string filename = "out.bin"; /* output filename */
std::string str = "e101";
unsigned short u = stoi(str, 0, 16);
/* output converted value to terminal in hex */
std::cout.setf(std::ios::hex, std::ios::basefield); /* set hex output */
std::cout << "writing value to file: " << u << '\n'; /* for cout */
/* output converted value to file */
std::ofstream f (filename, f.trunc | f.binary); /* open out in binary */
if (!f.write(reinterpret_cast<char*>(&u), sizeof u)) { /* write 2 bytes */
std::cerr << "error: write of short to file failed.\n";
return 1;
}
}
使用/输出示例
$ ./bin/stoi_short
writing value to file: e101
生成的输出文件
通过使用hexdump程序转储文件内容进行确认,例如
$ hexdump out.bin
0000000 e101
0000002
仔细检查一下,如果还有其他问题,请告诉我。