C++ 创建一个使用4位编码表示整数0-9的文件
如何创建一个使用4位编码来表示由逗号('1111')分隔的整数0-9的文件?例如:C++ 创建一个使用4位编码表示整数0-9的文件,c++,encoding,integer,decoding,C++,Encoding,Integer,Decoding,如何创建一个使用4位编码来表示由逗号('1111')分隔的整数0-9的文件?例如: 2,34,99=0010 1111 0011 0100 1111 1001 1001实际上没有空格 00101111100110100111110011001=binary.txt 因此,00101111100110100111110011001是我在二进制视图中查看WINHEX中的文件('binary.txt')时看到的,但在记事本中查看文件(binary.txt)时我会看到2,34,99 如果不是记事本,是否
2,34,99=0010 1111 0011 0100 1111 1001 1001实际上没有空格
00101111100110100111110011001
=binary.txt
因此,00101111100110100111110011001
是我在二进制视图中查看WINHEX中的文件('binary.txt')时看到的,但在记事本中查看文件(binary.txt)时我会看到2,34,99
如果不是记事本,是否有其他解码器将执行“4位编码”或我是否有编写“解码器程序”来查看整数
我如何在C++中实现这一点?
< p>你可以使用<代码> OD-TX1<代码>对文件进行解码。如果你有这些(数字将显示为数字,逗号将显示为<代码> f< /代码>)。您还可以使用xxd
双向移动;它与Vim一起提供。使用xxd-r-p
将十六进制字符从stdin复制到stdout上的二进制文件,并使用xxd-p
执行另一种操作。您可以使用sed
或tr
将f
来回更改为,
格式的基本思想(每十进制数字4位)众所周知,称为BCD(二进制编码十进制)。但我怀疑0xF作为昏迷编码的使用是否已经确立,记事本是否更支持它
<>编写C++程序进行编码和解码是很容易的。唯一的困难是标准的IO使用字节作为更基本的单位,而不是比特,所以你必须将这些比特自己分组成字节。 < P>这是我能想出的最简单的C++ 4比特(BCD)编码算法——不太容易调用,但是也没有火箭科学。通过除法一次提取一个数字,然后将其添加到字符串中:
#include <iostream>
int main() {
const unsigned int ints = 3;
unsigned int a[ints] = {2,34,99}; // these are the original ints
unsigned int bytes_per_int = 6;
char * result = new char[bytes_per_int * ints + 1];
// enough space for 11 digits per int plus comma, 8-bit chars
for (int j=0; j < bytes_per_int * ints; ++j)
{
result[j] = 0xFF; // fill with FF
}
result[bytes_per_int*ints] = 0; // null terminated string
unsigned int rpos = bytes_per_int * ints * 2; // result position, start from the end of result
int i = ints; // start from the end of the array too.
while (i != 0) {
--i;
unsigned int b = a[i];
while (b != 0) {
--rpos;
unsigned int digit = b % 10; // take the lowest decimal digit of b
if (rpos & 1) {
// odd rpos means we set the lowest bits of a char
result[(rpos >> 1)] = digit;
}
else {
// even rpos means we set the highest bits of a char
result[(rpos >> 1)] |= (digit << 4);
}
b /= 10; // make the next digit the new lowest digit
}
if (i != 0 || (rpos & 1))
{
// add the comma
--rpos;
if (rpos & 1) {
result[(rpos >> 1)] = 0x0F;
}
else {
result[(rpos >> 1)] |= 0xF0;
}
}
}
std::cout << result;
}
#包括
int main(){
常量无符号整数=3;
无符号整数a[ints]={2,34,99};//这些是原始整数
无符号整数字节/int=6;
char*result=new char[bytes_per_int*ints+1];
//每个整数有足够的空间容纳11位数字加上逗号和8位字符
对于(int j=0;j>1)]=位数;
}
否则{
//甚至RPO意味着我们设置了字符的最高位
结果[(RPO>>1)]|=(数字>1)]=0x0F;
}
否则{
结果[(RPO>>1)]|=0xF0;
}
}
}
std::我真的怀疑它是否与vim一起提供。@Benoit:声称它与vim一起提供。也许当您下载vim时,您也会获得xxd;但xxd是由Jürgen Weigert编写的,而不是Bram Moolenaar。@Benoit:我所说的“与vim一起提供”是什么意思下载Vim时是否包含此内容。啊,好吧。我们之间的一个常见误解:)嗨!感谢您花时间编写代码。如何将“结果”写入/保存到文件中?在Unix shell中,您可以使用例如“myprogram>outputfile”从命令行保存输出如果你需要在C++代码中做,我建议你学习C++文件I/O:这是一个有趣的练习,我以前没有做过,所以不用感谢我。因为它只是整数,我看不出需要8位。我可以用WiHEX来读取文件而不是记事本。有什么关于如何把二进制输出到文件的想法?我已经用过了。“c:\\test.dat”,ios::binary | ios::in);,但它将数据转换为ASCII。