Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建一个使用4位编码表示整数0-9的文件_C++_Encoding_Integer_Decoding - Fatal编程技术网

C++ 创建一个使用4位编码表示整数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 如果不是记事本,是否

如何创建一个使用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

如果不是记事本,是否有其他解码器将执行“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。