如何创建一个使用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 ++中执行此操作?
答案 0 :(得分:1)
您的格式的基本思想(每位十进制4位)是众所周知的,称为BCD(二进制编码十进制)。但是我怀疑使用0xF作为昏迷的编码已经很好地建立起来了,甚至得到了记事本的支持。
用C ++编写程序来进行编码和解码非常容易。唯一的困难是标准IO使用字节作为更基本的单位,而不是位,所以你必须将这些位分组成一个字节。
答案 1 :(得分:0)
您可以使用od -tx1
解码文件(如果有)(数字将显示为数字,逗号将显示为f
)。您也可以使用xxd
向两个方向前进;它配备了Vim。使用xxd -r -p
将stdin中的十六进制字符复制到stdout上的二进制文件,将xxd -p
复制到另一个方向。您可以使用sed
或tr
来回更改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