Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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 将二进制解析为十进制_C_Linux_Parsing_Binary_Ascii - Fatal编程技术网

C 将二进制解析为十进制

C 将二进制解析为十进制,c,linux,parsing,binary,ascii,C,Linux,Parsing,Binary,Ascii,我目前正在编写一个程序,它存储一个“uint16_t”数值数组,然后将它们写入一个二进制文件。出于对大小的考虑,我将写二进制文件(因为我将处理大量数据)。以下是我目前的代码: static int sizebuf=5; int main(int argc, const char *argv[]){ uint16_t buff[sizebuf]; for(int i=0; i<sizebuf; i++){ buff[i]=i; }

我目前正在编写一个程序,它存储一个“uint16_t”数值数组,然后将它们写入一个二进制文件。出于对大小的考虑,我将写二进制文件(因为我将处理大量数据)。以下是我目前的代码:

static int sizebuf=5;
int main(int argc, const char *argv[]){
     uint16_t buff[sizebuf];
     for(int i=0; i<sizebuf; i++){
            buff[i]=i;
     }
     FILE *fpbin=fopen("test.bin","a+");
     fwrite(buff, sizeof(uint16_t), sizeof(buff)/sizeof(uint16_t), fpbin);
     rewind(fpbin);

     uint16_t buffer[sizebuf];
     fread(buff, sizeof(uint16_t), sizebuf, fpbin);
     for (int i = 0; i < 5; i++)
     {
         printf("%" PRIu16 "\n",buffer[i]);
     }
     fclose(fpbin);
     return 0;
 }
首先,我不太确定我是否理解第一个“000000”和最后一个“00000a”值的存在。其次,我如何将这些值转换回小数(即转换回原始数值)?我所咨询的资料来源之间的共识似乎意味着没有标准的方法来实现这一点(鉴于我处理的是通用二进制输出,我理解这一点),但我可以用什么方法来处理我的特定数据以进行转换

谢谢你的帮助


编辑: 在添加代码的“fread”位后,我收到了以下输出:

5
0
10416
49150
0

0000000实际上是指行号。它不在二进制文件中,而是由十六进制转储应用程序生成的。第二行将包含00000010,它表示每个行号最多有16个字节

每行以换行符结束,换行符为ascii 0xa。每一行都会以这个结尾


将每个字节转换为一个数字,然后使用itoa获取ascii值

第一个
000000
是文件中的偏移量。由于该数据来自文件的开头,因此偏移量为
0
000000a
是总文件大小-在您的情况下为10字节(5个数组条目乘以每个条目2字节)。通常,该行将位于数据的新行上;您确定复制/粘贴正确吗

以下是我的机器上的一些示例以及您的程序输出:

$ hexdump test.bin # traditional hexdump output
0000000 00 00 01 00 02 00 03 00 04 00                
000000a

$ hexdump -d test.bin  # two-byte decimal output
0000000   00000   00001   00002   00003   00004                        
000000a

$ hexdump -x test.bin  # two-byte hexadecimal output 
0000000    0000    0001    0002    0003    0004                        
000000a
如果要从二进制文件生成一些十进制输出,则需要向hexdump提供一些格式信息:

$ hexdump -e '5/2 "%d " "\n"' test.bin 
0 1 2 3 4
或者,在程序中使用
fprintf
使程序输出文本,而不是二进制数据。将
fwrite
调用替换为:

 for (int i = 0; i < sizebuf; i++)
     fprintf(fpbin, "%d\n", buff[i]);

使用
hextump-x
od-x
检查输出时,您会看到

0000000 0000 0001 0002 0003 0004
000000a
最左边的列是十六进制的偏移量。这两个实用程序都输出一个没有任何数据的最终地址,以显示解析的字节数

换句话说,输出包含
0x0a
=10个字节,可以解释为五个16位字:
0x0000
=0、
0x0001
=1、
0x0002
=2、
0x0003
=3和
0x0004
=4

如果您只需要十六进制单词,每行一个单词,请使用
od-v-An-w2-t2
。对于十进制字,请使用
od-v-An-w2-td2


有关输出的更多详细信息,请参见或。

只需使用
fread
将值读回
uint16\u t
。你说的转换回ascii是什么意思
printf
应该能够做到这一切。“返回到Ascii文本”--这些都不是“Ascii文本”。您的意思可能是“返回十进制记数法”。您确定最后一个
000000a
不在下一行吗?感谢您的及时回复。我已经更新了上面的代码,以反映巴特的建议。我还尝试了“%d”格式标识符。是的,我的意思是回到十进制。是的,00000a在下一行。你的
fread
代码声明
buffer
,但随后读入
buff
,因此当你打印
buffer
的内容时,你打印的是未初始化的垃圾……OP的程序没有生成新行。
000000a
是第二个“行号”。不过,这些并不是真正的行号,它们是十六进制偏移量。第一个字节的偏移量为0000000,在输出的最后一行之后,hextump程序显示一行没有内容,显示下一个字节的偏移量。感谢您的回复。事实证明,我要处理大量的数据,所以我希望先写入一个二进制文件,这样我就不会使用文件大小。我只是在寻找一种从我创建的二进制文件中获取原始十进制数据的方法。我想我的答案解决了这个问题,还是我误解了?
$ cat test.bin 
0
1
2
3
4
0000000 0000 0001 0002 0003 0004
000000a