string temptarget = “ 01110110001100100110010101111000 “;
void Target()
{
ofstream fout;
fout.open("Target.txt", ios::out | ios::binary);
fout.write(temptarget.data(), temptarget.size());
fout.close();
}
打开 Target.txt 后仍是 01110110001100100110010101111000, 要怎么才可以在文本编辑器显示 v2ex
1
wevsty 2018-02-23 20:56:08 +08:00
附加了 ios::binary 标志位就是按照二进制方式写入的。
string temptarget = “ 01110110001100100110010101111000 “; 这个样写并不是把 01110110001100100110010101111000 当作二进制存入 string 的意思。 |
3
aheadlead 2018-02-23 21:12:35 +08:00
string temptarget = "v2ex";
|
5
aheadlead 2018-02-23 21:23:12 +08:00
@emtry https://stackoverflow.com/questions/537303/binary-literals
如果你的 cpp 编译器够新的话 可以用 binary literal 此外你还要注意字节序… |
6
zeanzhou 2018-02-23 21:27:12 +08:00
每 8 个 bit 转成一个 char,输出 char
|
7
acros 2018-02-23 21:33:03 +08:00
这个必须自己手动转化吧?
而且你以 string 形式得到的 01 序列,编码格式和 little/big Endian 都要自己考虑····· |
8
acros 2018-02-23 21:35:37 +08:00
这个数据源有点奇怪,数据是 char/byte 数组还差不多,怎么会是 string 类型的····
要在 01110110001100100110010101111000 输出后看到 v2ex,那你也该以文本形式写入。 似乎题目描述有点矛盾。 |
10
snnn 2018-02-23 22:02:26 +08:00 via Android
自己写个简单的 for 循环就可以把二进制字符串转 char 数组。然后 fopen、fwrite、fclose 了事
|
12
kohnv 2018-02-23 22:12:39 +08:00
这个字符串里的每一个 0 和 1 看上去是 01, 实际上是一个 8 位的 char. 你得写个函数, 通过位运算将 8 个 0/1 的 char 转成一个字节.
|
13
aheadlead 2018-02-23 22:17:35 +08:00
@emtry 哈哈哈 果然是哈夫曼编码
其实我也干过同样的事情 这作业老师没要求的话 其实你就用文本存 0101 也无妨 这门课里重要的是算法 实在有限制的话 因为写文件只能是以 byte 为单位 你就把读写 bit 的步骤封装一层 |
14
aheadlead 2018-02-23 22:31:15 +08:00
@emtry
这位兄弟 @kohnv 说的对, '0' 的 ascii 码是 48,48 的二进制表示是 00110000 ; '1' 的 ascii 码是 49,49 的二进制表示是 00110001。 字符串 "01011" 实际上是 40 (五个字符)+8 (结束符 '\0') 个 bit: 0011 0000 0011 0001 0011 0000 0011 0001 0011 0001 0000 0000 (理论上没有中间的空格的,只是为了好看) --- 而 "v2ex" 这个字符串,通过查 ascii 表 可知,其实他是 40 个 bit 组成的: 0111 0110 0011 0010 0110 0101 0111 1000 0000 0000 0111 0110 = 'v' = 118 0011 0010 = '2' = 50 0101 0111 = 'e' = 101 0111 1000 = 'x' = 120 0000 0000 = '\0' = 0 你可以试试看: printf("%c%c%c%c", 118, 50, 101, 120); |