如何提取PDU格式文件里的汉字和图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提取PDU格式文件里的汉字和图片相关的知识,希望对你有一定的参考价值。

手机彩信恢复失败,软件不能用。留下了一部分PDU格式的文件。用txt打开后确认是彩信的备份文件。但是是乱码。我该如何提取里面的汉字或图片
尝试过用XML格式打开后转码。但是无效果,我都被迫看了一段儿的PDU格式的编码与解码了。求高手。

微软在Microsoft Office 2003中的工具组件中有一个“Microsoft Office Document Imaging”的组件包,它可以直接执行光学字符识别(OCR),下面笔者就为大家介绍利用Office 2003新增的OCR功能从图片中提取文字的方法。 第一步 我们需要安装“Microsoft Office Document Imaging”的组件,点“开始→程序”,在 “Microsoft Office 工具” 里点“ Microsoft Office Document Imaging” 即可安装运行(如图1所示)。 图1 安装组件 第二步 打开带有文字的图片或电子书籍等,找到你希望提取的页面,按下键盘上的打印屏幕键(PrintScreen)进行屏幕取图。 第三步 打开Microsoft Office Word 2003 ,将刚才的屏幕截图粘贴进去;点击“文件”菜单中的“打印”,在安装Microsoft Office Document Imaging组件后,系统会自动安装一个名为“Microsoft Office Document Imaging Writer”的打印机。如图2所示,在“打印机”下拉列表框中选择“Microsoft Office Document Imaging Writer”打印机,其他选项无须额外设置,点击“确定”按钮后,设定好文件输出的路径及文件名(缺省使用源文件名),然后很快就可以自动生成一个MDI格式的文档了。 参考技术A pdu的文件里包含了一个smil规范的彩信内容,其中说明了里面还有的图片,文本以及对应的大小和名字等,但是并不包含其图片或者文字的内容,而这些内容是保存在其他地方了,只通过pdu是无法完全恢复丢失的彩信的追问

这些图片和内容一般保存在哪儿。文字内容不在里面?但是从我印象里的彩信内容与这些文件的大小略微符合。。要是真不行。那就真心悲剧了

追答

这些附件都保存在手机的data/data/com.android.providers.telephony/app_parts文件夹下,手机连接电脑,打开调试模式,使用在控制台下使用adb命令可以将其取出来
命令:adb pull data/data/com.android.providers.telephony/app_parts/文件名 c:\
将其取出保存到c盘根目录,最后修改文件的后缀名就可以将彩信中的附件内容获取

追问

多谢。最后一问。您是否能对这些pdu文件解码?

追答

可以是可以,不过pdu中所描述的文件如果没有的话是无法还原彩信的,相当于我们只知道彩信中的结构,比如知道有图片还是问题,图片有几个等,但是无法看到图片和文字的内容

本回答被提问者采纳
参考技术B 部分数据丢失,转码也没用;图片是看不到了,里面的文字应该可以找到追问

如何找?

参考技术C 实施能转成pdf格式吗,然后可以导成文字和图片,电脑操作

支持smil文件的MMS PDU打包方式.

 mms如果不支持smil那就不能叫真正的MMS,mixed的格式对于多个附件的MMS来说不仅没有"排版"功能,

而且即使用你想一个文件一个文件"拆单了看",也不得不看一次手工播放一次,就象要手动"翻页".所以不支持

smil干脆就别玩MMS了.

但基于related格式的支持smil的PDU打包方式怎么也搜索不到,很多厂商和技术人员都故作神秘,不就是一

堆规范的实现吗?只好下了几个文档来研究,经过反复调试,其中用nowSMS的mmscomp打包出来的格式竟然

是错误的,最后多次抓包比较,总算成功了.在『别人原来的mixed方式』的基础上修改成related方式的.有需要的

就自己用去吧.(注意基础类是别人原来提供的,我只是提供了related方式的打包逻辑)

工程文件在:http://dl2.csdn.net/down4/20070706/06201955542.rar

 

using  System;
using  System.Net;
using  System.IO;
using  System.Diagnostics;
using  System.Threading;
using  System.Collections;
using  System.Text;
///   <summary>
///  Lib 的摘要说明
///   </summary>


namespace  MMSLib


    
public   class  MMessage
    
        
string  subject  =   " 测试 " ;
        
int  deliverTime  =   0 ;    //    多少秒以后开始投递
        ArrayList inlineFiles  =   new  ArrayList();        //    文件列表  
        ArrayList destinations  =   new  ArrayList();       //    目标号码  

        
static   long  serialNumber  =   19700311L ;                   //    流水号
        FileInfo smilFile;



        
public   void  SetSubject( string  subject)
        
            
this .subject  =  subject;
        
        
public   void  SetDeliverTime( int  deliverTime)
        
            
this .deliverTime  =  deliverTime;
        
        
//     
         public   void  AddTo( string  dest)
        
            destinations.Add(dest);
        

        
public   void  AddFile( string  file)
        

            
if  (file.ToLower().EndsWith( " .smil " ))
            
                
if  ( this .smilFile  !=   null )
                    
throw   new  Exception( " The smil file has existed! " );
                
this .smilFile  =   new  FileInfo(file);
            
            inlineFiles.Add(file);
        

        
public   void  ClearTo()
        
            destinations.Clear();
        

        
//    得到二进制编码字节  
         public   byte [] MakeMMSContent()
        

            
if  ( this .smilFile  ==   null throw   new  Exception( " The smil file not found! " );

            
byte [] MMSContent  =   new   byte [ 0 ];
 
            
// X-Mms-Message-Type  
            MMSContent  =  appendContent( new   byte []   0x8C 0x80  , MMSContent);

            
            
// X-Mms-Transaction-ID  
            MMSContent  =  appendContent( new   byte []   0x98  , MMSContent);
            MMSContent 
=  appendContent(serialNumber.ToString(), MMSContent);
            serialNumber
++ ;   

            MMSContent 
=  appendContent( new   byte []   0x0  , MMSContent);

            
// X-Mms-MMS-Version  
            MMSContent  =  appendContent( new   byte []   0x8D 0x90  , MMSContent);

            
// Date  
            MMSContent  =  appendContent( new   byte []   0x85  , MMSContent);
            TimeSpan ts 
=  DateTime.Now  -   new  DateTime( 1970 1 1 0 0 0 );
            
int  sec  =  ( int )ts.TotalSeconds;
            
byte [] bySec  =  BitConverter.GetBytes(sec);
            MMSContent 
=  appendContent( new   byte []  ( byte )bySec.Length , MMSContent);
            Array.Reverse(bySec);
            MMSContent 
=  appendContent(bySec, MMSContent);

            
if  (deliverTime  >   0 )
            
                MMSContent 
=  appendContent( new   byte []   0x87  , MMSContent);
                
byte [] bfTime  =  BitConverter.GetBytes(deliverTime);     
                Array.Reverse(bfTime);
                
byte [] bfTimeLen  =   new   byte [ 3 ];
                bfTimeLen[
0 =  ( byte )(bfTime.Length  +   2 );
                bfTimeLen[
1 =   0x81 ;      //    相对时间格式  
                bfTimeLen[ 2 =  ( byte )bfTime.Length;
                MMSContent 
=  appendContent(bfTimeLen, MMSContent);
                MMSContent 
=  appendContent(bfTime, MMSContent);
            


            
// From,Len = 0x01,一个以0x81为标记的占位符,发送时自动插入发送号码.
            MMSContent  =  appendContent( new   byte []   0x89 0x01 0x81  , MMSContent);

            
// To  
             for  ( int  i  =   0 ; i  <  destinations.Count; i ++ )
            
                MMSContent 
=  appendContent( new   byte []   0x97  , MMSContent);
                MMSContent 
=  appendContent( " +86 "   +  ( string )destinations[i]  +   " /TYPE=PLMN " , MMSContent);
                
// MMSContent = appendContent(new byte[]  0x20, 0x20, 0x0 , MMSContent);
                MMSContent  =  appendContent( new   byte []   0x0  , MMSContent);
            

            
// subject  
             if  (subject.Length  >   0 )      //    使用Utf8编码  
            
                MMSContent 
=  appendContent( new   byte []   0x96  , MMSContent);
                
byte [] byLen  =   new   byte [ 1 ];
                byLen[
0 =  ( byte )(Encoding.UTF8.GetByteCount(subject)  +   2 );
                MMSContent 
=  appendContent(byLen, MMSContent);
                MMSContent 
=  appendContent( new   byte []   0xEA  , MMSContent);
                MMSContent 
=  appendContent(Encoding.UTF8.GetBytes(subject), MMSContent);
                MMSContent 
=  appendContent( new   byte []   0x0  , MMSContent);
            


            MMSContent 
=  appendContent( new   byte []   0x84  , MMSContent);
            
int  ctLen  =   2     //  0xB3 ,0x89
                 +    " application/smil " .Length
                
+   3           // 0x00 0x8A 0x3c
                 +  smilFile.Name.Length
                
+   2 ;          // 0x3c,0x00

            
byte [] cl  =  uintToBytes(ctLen);

            
if (cl[ 0 >=   0x1F )
                MMSContent 
=  appendContent( new   byte []   0x1F  , MMSContent);
            MMSContent 
=  appendContent(cl, MMSContent);
            MMSContent 
=  appendContent( new   byte []   0xB3 , MMSContent);
                
// 0xB3   Content-Type:application/vnd.wap.multipart.related
            
            MMSContent 
=  appendContent( new   byte []   0x89  , MMSContent);
            MMSContent 
=  appendContent(Encoding.ASCII.GetBytes( " application/smil " ), MMSContent);
            MMSContent 
=  appendContent( new   byte []   0x0  , MMSContent);

            MMSContent 
=  appendContent( new   byte []   0x8A  , 0x3C , MMSContent); // 0x8A:Start,0x3C:<
            MMSContent  =  appendContent(Encoding.ASCII.GetBytes( smilFile.Name ), MMSContent);
            MMSContent 
=  appendContent( new   byte []   0x3E  , 0x0  , MMSContent);  // 0x3E:>





            
byte [] byFileCount  =   new   byte [ 1 ];
            byFileCount[
0 =  ( byte )inlineFiles.Count;
            MMSContent 
=  appendContent(byFileCount, MMSContent);

            
int  chLen  =   " application/smil " .Length 
            
+   4       // 0x00 0xc0 0x22 0x3c: cid,",<
             +  smilFile.Name.Length
            
+   3       //  0x3E,0x00,0x8E
             +  smilFile.Name.Length
            
+   1 ;      //  0x00
            
            
for  ( int  j  =   0 ; j  <  inlineFiles.Count; j ++ )
            
                MMSContent 
=  appendContent(GetFileContent(inlineFiles[j].ToString()), MMSContent);
            
            
return  MMSContent;
        


        
//    打包文件
         private   byte [] GetFileContent( string  FileName)
        

            
byte [] byHeaders  =   new   byte [ 0 ];        //    ContentType和Headers组合  
             byte [] byData  =  readFile(FileName);

            
string  FileID  =  getContentId(FileName);
            
if  (FileName.EndsWith( " .txt " ))
            
                byHeaders 
=   new   byte [ 1 ];
                byHeaders[
0 =  ( byte )(Encoding.ASCII.GetByteCount(FileID)  +   5 );
                byHeaders 
=  appendContent( new   byte []   0x83 0x85  , byHeaders);        //    Utf-8  
                byHeaders  =  appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
                byHeaders 
=  appendContent( new   byte []   0x00  , byHeaders);
                byHeaders 
=  appendContent( new   byte []   0x81 0xEA  , byHeaders);

            
            
else   if  (FileName.EndsWith( " .gif " ))
            
                byHeaders 
=   new   byte []   0x9D  ;
            
            
else   if  (FileName.EndsWith( " .mid " ||  FileName.EndsWith( " .midi " ))
            
                byHeaders 
=  Encoding.ASCII.GetBytes( " audio/midi " );
                byHeaders 
=  appendContent( new   byte []   0x00  , byHeaders);     
            
            
else   if  (FileName.EndsWith( " .smil " ))
            
                byHeaders 
=  Encoding.ASCII.GetBytes( " application/smil " );
                byHeaders 
=  appendContent( new   byte []   0x00  , byHeaders);     
            

            
// 加入Content-ID 
            byHeaders  =  appendContent( new   byte []   0xC0 0x22 0x3C  , byHeaders);
            byHeaders 
=  appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
            byHeaders 
=  appendContent( new   byte []   0x3E 0x00  , byHeaders);
            
            
// 加入Content-Location  
            byHeaders  =  appendContent( new   byte []   0x8E  , byHeaders);
            byHeaders 
=  appendContent(Encoding.ASCII.GetBytes(FileID), byHeaders);
            byHeaders 
=  appendContent( new   byte []   0x00  , byHeaders);

            
byte [] byHeaderLen  =  uintToBytes(byHeaders.Length);
            
byte [] byDataLen  =  uintToBytes(byData.Length);

            
byte [] byMmc  =   new   byte [byHeaderLen.Length  +  byDataLen.Length  +  byHeaders.Length  +  byData.Length];
            Array.Copy(byHeaderLen, byMmc, byHeaderLen.Length);
            Array.Copy(byDataLen, 
0 , byMmc, byHeaderLen.Length, byDataLen.Length);
            Array.Copy(byHeaders, 
0 , byMmc, byHeaderLen.Length  +  byDataLen.Length, byHeaders.Length);
            Array.Copy(byData, 
0 , byMmc, byHeaderLen.Length  +  byDataLen.Length  +  byHeaders.Length, byData.Length);

            
return  byMmc;
        

        
private   byte [] uintToBytes( int  n)
        
            
byte [] buf  =   new   byte [ 8 ];
            
int  l  =   0 ;
            
while  (n  >=   128 )
            
                
byte  b  =  ( byte )(n  &   0x7F );
                n 
=  n  >>   7 ;
                buf[l
++ =  b;
            
            buf[l
++ =  ( byte )n;

            
byte [] retBys  =   new   byte [l];
            
for  ( int  i  =   0 ; i  <  l;  ++ i)
            
                retBys[i] 
=  ( byte )(buf[l  -  i  -   1 |   0x80 );
            
            retBys[l 
-   1 &=   0x7F ;
            
return  retBys;

        
        
        
//    读取文件  
         private   byte [] readFile( string  FileName)
        
            
if  (FileName.EndsWith( " .txt " )) 

                StreamReader sr 
=   null ;
                
try
                    sr 
=   new  StreamReader(FileName, Encoding.Default);
                    
string  text  =  sr.ReadToEnd();
                    
byte [] bf  =  Encoding.UTF8.GetBytes(text);
                    
return  bf;
                
                
catch  
                    
return   new   byte [ 0 ];
                
                
finally  
                    
if  (sr  !=   null ) sr.Close();
                
            
            FileStream fs 
=   null ;
            
try
            
                fs 
=   new  FileStream(FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None);      //    没有设定Buffsize  
                 byte [] bf  =   new   byte [fs.Length];
                fs.Read(bf, 
0 , ( int )fs.Length);
                
return  bf;
            
            
catch
                
return   new   byte [ 0 ];
            
            
finally
                
if (fs  !=   null ) fs.Close();
            
        
        
        
private   string  getContentId( string  FileName)
        
            
int  at  =  FileName.LastIndexOf( " / " );
            
if  (at  <   0 )
                at 
=  FileName.LastIndexOf( " / " );
            
return  FileName.Substring(at  +   1 );
        
  
        
private   byte [] appendContent( byte [] srcBys,  byte [] destBys)
        
            Array.Resize(
ref  destBys, srcBys.Length  +  destBys.Length);
            Array.Copy(srcBys,
0 ,destBys,destBys.Length  -  srcBys.Length,srcBys.Length);
            
return  destBys;
        

        
private   byte [] appendContent( string  sz,  byte [] byDest)
        
            
return  appendContent(Encoding.Default.GetBytes(sz), byDest);
        
    

    
///     <summary>   
    
///    MMSender   的摘要说明。  
    
///     
    
///     </summary>   
     public   class  MMSender
    
        
//    设置参数  
         string  sMmscUrl  =   "

以上是关于如何提取PDU格式文件里的汉字和图片的主要内容,如果未能解决你的问题,请参考以下文章

在线PDU格式编码/解码

如何提取安卓apk文件中的图片资源?(resources.arsc中的)

关于C#从Word文件中提取内容(包括样式文字,图片,公式,表格)等信息,解析分字段写入数据库的问题。

文件夹里的照片怎么批量删除

请问有没有能把图片里的文字和表格直接提取出来的软件?

arcgis中汉字怎么导出来