中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS开发编程 & 发展交流 (开发室) » [求助]DOS下如何将TXT的16进制数据转成BIN?(已解决)
<<   [1] [2]  >>   >
作者:
标题: [求助]DOS下如何将TXT的16进制数据转成BIN?(已解决) 上一主题 | 下一主题
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『楼 主』:  [求助]DOS下如何将TXT的16进制数据转成BIN?(已解决)

最好不要使用第三方软件(XP系统) 找到过一个TXT_BIN软件,但只能先运行TXT_BIN软件,手动输入TXT文件回车后再输入BIN文件名生成BIN文件; 是否有直接“TXT_BIN TXT BIN”命令方式的软件,或者可以修改附件的TXT_BIN软件为“TXT_BIN TXT BIN”命令方式? [ Last edited by zxcv on 2006-7-18 at 02:24 ]


附件 1: txt_bin.rar (2006-7-17 02:05, 8.79 K, 下载附件所需积分 1 点 ,下载次数: 81)
2006-7-17 02:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 2 楼』:  

我可以给你写一个 但是你的这些二进制文本字符,总要有分割符吧? 否则没法处理啊。。


2006-7-17 12:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 3 楼』:  

两种方式: 1、每“112233445566778899AABBCCDDEEFF”32字符一行(BIN为16字节,适合转换TXT文件) 2、所有数据单一行(适合命令行“命令 字符 BIN”方式直接写入,感觉这样的命令行很长,最高字符960个) 其实分割符就一种:回车换行(16进制“0D0A”),这个不需要转换


2006-7-17 17:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 4 楼』:  

1 DOS下 C最大可处理的16进制字符的数值是4个字节(32位,(16进制为8个字符位,比如12345678,FFFFFFFF)啊,所以必须要每隔8个字符就要有分割符号啊。 浮点不能处理16进制字符 2 没弄明白你的意思。。 [ Last edited by GOTOmsdos on 2006-7-17 at 17:57 ]


2006-7-17 17:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 5 楼』:  

文本内容:
112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF
转换为BIN后用16进制软件打开看到的16进制内容也为:
112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF
另外也可以反相转换: 16进制软件打开BIN看到的16进制内容为:
112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF
转换生成文本文件内容:
112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF 112233445566778899AABBCCDDEEFF
至于第二种方式不要了


2006-7-17 19:36
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

Re zxcv: 可以使用自带工具debug,但是它要求输入的源16进制数据按字节以空格进行分隔。如:11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF GOTOmsdos兄的意见与此类似。 如果无法实现源串输出的格式控制,就需要在批处理中对串进行重新解析,将源串分解为debug可识别的数据串。这需要使用for/f文本遍历和set的取子串功能,效率相对是比较低的。 另外,debug需要知道转换后BIN的字节长度,而且这个值必须是十六进制值,这又需要用到较复杂的数值计算。 关于txt_bin的命令行方式,可以编写以下的批处理文件t2b,然后以 "t2b TXT BIN" 的方法运行。但是,这个软件应该存在某些问题,在我使用一个不存在的txt文件时,不会提示错误,而会以字符FF持续生成BIN文件。而且它并不会识别0d0a的分割。 最后,提出两点问题: 一、请不要将XP下的“命令提示符”称之为DOS,XP自己都已经不再如此称呼了; 二、你给的数据例子,每行只有30个字符,只能代表15个字节。
@echo off
if "%2"=="" goto end
if not exist %1 goto end
if exist %2 goto end
echo %1>txt_bin.scr
echo %2>>txt_bin.scr
txt_bin <txt_bin.scr>nul
:end
[ Last edited by willsort on 2006-7-17 at 20:50 ]




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-7-17 20:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 7 楼』:  

谢谢willsort版主的纠正,95年开始玩DOS,主要还是玩游戏,对于批处理、编程的没认真研究过:P 因为我是用批处理将一整段已转换为16进制字符的数据直接自动写成BIN文件(当然也可以用VBS脚本控制WinHex写入,但这失去了使用命令提示符转换的意义)后再执行其他命令 按GOTOmsdos的方法 文本内容需要处理成:
00112233,44556677,8899AABB,CCDDEEFF, 00112233,44556677,8899AABB,CCDDEEFF, 00112233,44556677,8899AABB,CCDDEEFF, 00112233,44556677,8899AABB,CCDDEEFF, 00112233,44556677,8899AABB,CCDDEEFF, 00112233,44556677,8899AABB,CCDDEEFF,
不知是否理解正确??? 不知是否txt_bin软件的原因,willsort版主的批处理执行后不能自动退出到命令提示符 另:不知txt_bin软件如何实现以下文本(每行最多128字符,可以多行,每行少于128字符会在转换下一行时开头缺少1个字符)
00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF 00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF
转换成16进制显示的:
00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
而不用分隔符 [ Last edited by zxcv on 2006-7-17 at 23:05 ]


2006-7-17 22:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 8 楼』:  

我没说一定要8个字符分割,是说最大8个要分割 看你的意思,其实,以2个字符分割最合适 这样吧,我现在帮你写一下,很快就搞定(10分钟左右),要纯DOS的也行,要WIN 的提示符的也行。。


2006-7-18 00:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 9 楼』:  

麻烦GOTOmsdos了 主要是在WIN 的提示符里执行 分割最好能以最小分割数为好 我要生成的BIN文件最长是480字节(960个文本) 另:能不能把BIN文件的16进制数据转换成文本文件(根据0D0A位置换行)? [ Last edited by zxcv on 2006-7-18 at 01:30 ]


2006-7-18 00:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 10 楼』:  

解决了 #include <stdio.h> main(int argc, char *argv[]) { FILE *txt,*bin; //unsigned char buf[51200]; unsigned int dig; unsigned char w[3]; unsigned char buf; char stopStr=0; w[2]=0; if((txt=fopen(argv[1],"rb"))==NULL) { printf("File error : %s\n",argv[1]); return; } if((bin=fopen(argv[2],"wb"))==NULL) { printf("File error : %s\n",argv[2]); return; } dig=getw(txt); while(!feof(txt)) { memcpy(w,&dig,2); if(w[0]!=0x0d && w[0]!=0x0a && w[1]!=0x0d && w[1] !=0x0a) { buf=(char)strtol(w,&stopStr,16); putc(buf,bin); } dig=getw(txt); } fclose(txt); fclose(bin); /* for(i=0,j=0;j<5120;i+=2,j++) { memcpy(buffer,edit+i,2); //StrbackToPreviousDiskBufEx(buffer,STIF_SUPPORT_HEX,&backToPreviousDiskBuf[j]); backToPreviousDiskBuf[j]=(char)strtol(buffer,&stopString,16); */ } [ Last edited by GOTOmsdos on 2006-7-18 at 01:59 ]


2006-7-18 01:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 11 楼』:  

Originally posted by GOTOmsdos at 2006-7-18 01:58: 解决了
???


2006-7-18 01:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 12 楼』:  

我重发贴,才可以上传。。你找新帖吧。。


2006-7-18 02:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 13 楼』:  

另:能不能把BIN文件的16进制数据转换成文本文件(根据0D0A位置换行)? 转成BIN后,已没有回车换行的数据了,不过可以由用户再次指定每隔几个字符插入回车换行。也可没有。


2006-7-18 14:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 14 楼』:  

Originally posted by GOTOmsdos at 2006-7-18 14:22: 另:能不能把BIN文件的16进制数据转换成文本文件(根据0D0A位置换行)? 转成BIN后,已没有回车换行的数据了,不过可以由用户再次指定每隔几个字 ...
我已经用for来解决0D0A位置换行了,差把BIN文件16进制数据转换成文本文件了 文本内容:
00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A
bat:
@echo off set N=1 for /f %%x in (Name_8.txt) do set Name_8=%%x set Name_8=%Name_8:0D0A= % for /f "tokens=1,2,3,4,5,6,7,8,9*" %%a in ("%Name_8%") do ( set Name-1=%%a set Name-2=%%b set Name-3=%%c set Name-4=%%d set Name-5=%%e set Name-6=%%f set Name-7=%%g set Name-8=%%h set Name-9=%%i set Name-10=%%j set Name1=%%a set Name2=%%b set Name3=%%c set Name4=%%d set Name5=%%e set Name6=%%f set Name7=%%g set Name8=%%h set Name9=%%i set Name10=%%j ) :len echo :len>Temp.bat echo set Name%N%=%%Name%N%:~0,-1%%>>Temp.bat echo set /a num%N%=%%num%N%%%+1>>Temp.bat echo if not "%%Name%N%%%"=="" goto len>>Temp.bat echo set /a num%N%=%%num%N%%%/2>>Temp.bat call Temp.bat del Temp.bat set /a N=%N%+1 if %N% GTR 10 goto End goto len :End echo. echo %Name-1% echo -%num1%字节 echo %Name-2% echo -%num2%字节 echo %Name-3% echo -%num3%字节 echo %Name-4% echo -%num4%字节 echo %Name-5% echo -%num5%字节 echo %Name-6% echo -%num6%字节 echo %Name-7% echo -%num7%字节 echo %Name-8% echo -%num8%字节 echo %Name-9% echo -%num9%字节 echo %Name-10% echo -%num10%字节 echo. pause
[ Last edited by zxcv on 2006-7-18 at 16:01 ]


2006-7-18 14:56
查看资料  发短消息 网志   编辑帖子  回复  引用回复
GOTOmsdos
铂金会员

C++启程者


积分 5154
发帖 1827
注册 2003-7-18
状态 离线
『第 15 楼』:  

刚才才发现,你是要保留回车换行的,我替你去掉了。。 是不是? 现在 我改写程序,马上传上来。。


2006-7-18 15:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: