非文本格式文件中的换行符序列如何?
How about sequence of newline symbols in non-text format files?
到目前为止,我一直在练习 IBM 8086 架构的汇编,并且我收到了编写一个程序来交换任意 2 行文件的任务。 (我通过参数给出数据文件名和这两行的编号)。我程序的算法如下:
1) 我正在使用有限大小的缓冲区(例如 20 字节大小的缓冲区)。我从文件中读取数据到这个缓冲区,如果到达文件末尾则不断检查 ax 寄存器的值。
2) 我将此缓冲区传递给检查 13d 符号(CR ASCII 代码)并将缓冲区元素传递给新的写入文件缓冲区的过程,如果检测到符号 13d,则传递写入文件缓冲区停止并且新行触发变量设置为 1。然后如果找到这个换行符 13d 符号,我调用另一个过程 returns 文件指针指向正确的位置(因为我使用自定义大小的缓冲区,我可能会在缓冲区中间找到 13d 符号,所以我需要重置指针以更正新行。
所以我的程序似乎可以正确处理 .txt 文件,但是当我尝试交换 2 个随机行,例如 .exe 或 .jpg 文件,然后再次交换相同的行时,我无法打开它文件,因为 OS 说它已损坏。
我的问题是:是否可以尝试交换任何 2 行非文本格式文件,然后尝试将它们改回并期望新文件能够正常工作?这个概念理论上应该可行吗?或者由于各种不同的新行序列解释(CF+NL、NL+CF 等...)这样转换后的程序被破坏是可以的?
换句话说:非文本文件中换行符号的解释是什么?它们的顺序对正确的程序运行重要吗?
感谢您的回答,如果需要我的部分代码来回答问题,请通知我。
可以在非文本文件中换行。如果你做同样的事情两次,你应该收到相同的二进制文件。
你没有,因为其中一些:
您的缓冲区大小有限的算法无法正确处理这种情况?在二进制文件中,很有可能达到 100k+ 字节长度的 "lines"。
你没有使用二进制 read/write API(无法从问题中分辨出来)?文本API如Clibfopen
模式"rt"
可能会转换一些字节值,因此文件内容会被破坏。
what is the interpretation of new line symbols in non-text files?
二进制文件中换行符的解释可以是任何东西,包括换行符(在字符串数据中使用时),但从文件系统的角度来看它只是字节(0
-255
) 0x0D
和 0x0A
的值,与文件的任何其他字节一样。
也许尝试找到一些失败的极短二进制文件(可能是一些 4096B 介绍),并使用 hexview 或二进制差异来查看文件损坏的位置,然后在调试过程中尝试找出这种情况是如何发生的。
Are their sequence important to the correct program operation?
当然,如果原来的二进制在机器码里面包含0D 0A
,那么只用0D
代替或者将两者翻转为0A 0D
,就会破坏原来的机器码指令.如果您只损坏了数据部分,该程序可能仍会以某种方式处理损坏的数据,但随机更改代码将需要大量的运气才能以几乎与原始部分一样的方式结束。
看到一些代码后:看起来 int 21h
使用了文件处理程序服务,因此 int 21h
本身可以处理文件的二进制内容(无转换)。
任何文件损坏都是由应用程序代码本身造成的。所以你必须调试你的算法并找出它失败的地方,然后修复它。
到目前为止,我一直在练习 IBM 8086 架构的汇编,并且我收到了编写一个程序来交换任意 2 行文件的任务。 (我通过参数给出数据文件名和这两行的编号)。我程序的算法如下:
1) 我正在使用有限大小的缓冲区(例如 20 字节大小的缓冲区)。我从文件中读取数据到这个缓冲区,如果到达文件末尾则不断检查 ax 寄存器的值。
2) 我将此缓冲区传递给检查 13d 符号(CR ASCII 代码)并将缓冲区元素传递给新的写入文件缓冲区的过程,如果检测到符号 13d,则传递写入文件缓冲区停止并且新行触发变量设置为 1。然后如果找到这个换行符 13d 符号,我调用另一个过程 returns 文件指针指向正确的位置(因为我使用自定义大小的缓冲区,我可能会在缓冲区中间找到 13d 符号,所以我需要重置指针以更正新行。
所以我的程序似乎可以正确处理 .txt 文件,但是当我尝试交换 2 个随机行,例如 .exe 或 .jpg 文件,然后再次交换相同的行时,我无法打开它文件,因为 OS 说它已损坏。
我的问题是:是否可以尝试交换任何 2 行非文本格式文件,然后尝试将它们改回并期望新文件能够正常工作?这个概念理论上应该可行吗?或者由于各种不同的新行序列解释(CF+NL、NL+CF 等...)这样转换后的程序被破坏是可以的?
换句话说:非文本文件中换行符号的解释是什么?它们的顺序对正确的程序运行重要吗?
感谢您的回答,如果需要我的部分代码来回答问题,请通知我。
可以在非文本文件中换行。如果你做同样的事情两次,你应该收到相同的二进制文件。
你没有,因为其中一些:
您的缓冲区大小有限的算法无法正确处理这种情况?在二进制文件中,很有可能达到 100k+ 字节长度的 "lines"。
你没有使用二进制 read/write API(无法从问题中分辨出来)?文本API如Clib
fopen
模式"rt"
可能会转换一些字节值,因此文件内容会被破坏。
what is the interpretation of new line symbols in non-text files?
二进制文件中换行符的解释可以是任何东西,包括换行符(在字符串数据中使用时),但从文件系统的角度来看它只是字节(0
-255
) 0x0D
和 0x0A
的值,与文件的任何其他字节一样。
也许尝试找到一些失败的极短二进制文件(可能是一些 4096B 介绍),并使用 hexview 或二进制差异来查看文件损坏的位置,然后在调试过程中尝试找出这种情况是如何发生的。
Are their sequence important to the correct program operation?
当然,如果原来的二进制在机器码里面包含0D 0A
,那么只用0D
代替或者将两者翻转为0A 0D
,就会破坏原来的机器码指令.如果您只损坏了数据部分,该程序可能仍会以某种方式处理损坏的数据,但随机更改代码将需要大量的运气才能以几乎与原始部分一样的方式结束。
看到一些代码后:看起来 int 21h
使用了文件处理程序服务,因此 int 21h
本身可以处理文件的二进制内容(无转换)。
任何文件损坏都是由应用程序代码本身造成的。所以你必须调试你的算法并找出它失败的地方,然后修复它。