创建一个使用4位编码的文件来表示整数0 -9

时间:2011-02-27 07:01:28

标签: c++ encoding integer decoding

如何创建一个使用4位编码表示由逗号('1111')分隔的整数0-9的文件?例如:

2,34,99 = 0010 1111 0011 0100 1111 1001 1001 =>实际上变得没有空格 0010111100110100111110011001 = binary.txt

因此,当我在二进制视图中查看WINHEX中的文件('binary.txt')时,我看到0010111100110100111110011001,但在记事本中查看文件(binary.txt)时我会看到2,34,99

如果不是记事本,是否有另一个解码器可以进行'4位编码',还是我有一个'解码器程序'来查看整数?

如何在C ++中执行此操作?

3 个答案:

答案 0 :(得分:1)

您的格式的基本思想(每位十进制4位)是众所周知的,称为BCD(二进制编码十进制)。但是我怀疑使用0xF作为昏迷的编码已经很好地建立起来了,甚至得到了记事本的支持。

用C ++编写程序来进行编码和解码非常容易。唯一的困难是标准IO使用字节作为更基本的单位,而不是位,所以你必须将这些位分组成一个字节。

答案 1 :(得分:0)

您可以使用od -tx1解码文件(如果有)(数字将显示为数字,逗号将显示为f)。您也可以使用xxd向两个方向前进;它配备了Vim。使用xxd -r -p将stdin中的十六进制字符复制到stdout上的二进制文件,将xxd -p复制到另一个方向。您可以使用sedtr来回更改f ,

答案 2 :(得分:0)

这是我能想到的最简单的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;
}

根据rpos修剪结果开始部分留下的虚假数据将留给读者练习。

以前也讨论了BCD转换的子问题:Unsigned Integer to BCD conversion?

如果你想要一个更有效的算法,这里有一堆演讲幻灯片,从8位整数转换为BCD:http://edda.csie.dyu.edu.tw/course/fpga/Binary2BCD.pdf