中国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 楼』:  

文本内容:

  Quote:
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF

转换为BIN后用16进制软件打开看到的16进制内容也为:

  Quote:
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF

另外也可以反相转换:
16进制软件打开BIN看到的16进制内容为:

  Quote:
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF
112233445566778899AABBCCDDEEFF

转换生成文本文件内容:

  Quote:
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的方法
文本内容需要处理成:

  Quote:
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个字符)

  Quote:
00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF
00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF

转换成16进制显示的:

  Quote:
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 楼』:  



  Quote:
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 楼』:  



  Quote:
Originally posted by GOTOmsdos at 2006-7-18 14:22:
另:能不能把BIN文件的16进制数据转换成文本文件(根据0D0A位置换行)?
转成BIN后,已没有回车换行的数据了,不过可以由用户再次指定每隔几个字 ...

我已经用for来解决0D0A位置换行了,差把BIN文件16进制数据转换成文本文件了

文本内容:

  Quote:
00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A00112233445566778899AABBCCDDEEFF0D0A

bat:

  Quote:
@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] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: