求助: 一段文本的解析,Unicode, UTF8 还是其他???!!!

kingmax54212008 2010-06-10 10:50:11
需要解析的文件我已经放到我的csdn资源空间里了,大家可以取下来看看:
http://download.csdn.net/source/2444008



用ultraedit打开是如下效果:
/**************************** Text starts *************************************/

HDDW C O P I E S P A G E W I D T H o P A G E L E N G T H
C O L O R D U P L E X A C C O U N T j i m m y D O M A I N S P C - 8 A 9 A E A 3 2 4 B 0 G R O U P N A M E D E F A U L T D E V I C E N A M E X e r o x 3 2 0 0 L O C A T I O N $\ \ S P C - 8 A 9 A E A 3 2 4 B 0 P O R T N A M E U S B 0 0 1 J O B D A T E Lb P A G E C O U N T J O B C O S T D O C U M E N T jM i c r o s o f t W o r d - _ -N齎;Sf[褃f[b?Sf[陙㏑噀pS鹼邁頞9e鷁畫蔛X[(W顣槝Gl;`. d o c . d o c J O B S I Z E 6 P O R T T Y P E I P S P C - 8 A 9 A E A 3 2 4 B 0
P O R T U S B 0 0 1 D R I V E R 6X e r o x P h a s e r 3 2 0 0 M F P P C L 6 A U D I T O R _ I D W K S _ I P 1 9 2 . 1 6 8 . 1 . 1 7 9

/******************************* Text ends ***********************************/


能看出其中的一些英文单词,其中也有中文。(看其中乱码部分, 字符“.doc.doc”前是一段中文。)

求助,看看各路高手有什么意见?走过路过,帮个忙!
多谢!!!
...全文
222 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
prayers 2010-06-12
  • 打赏
  • 举报
回复
顶!!!
kingmax54212008 2010-06-12
  • 打赏
  • 举报
回复
To tufaqing,

ParseData的时候, swap_bytes是做什么的?在最后都要进行一次swap,
比如执行: swap_bytes(&pInfo->hddw, sizeof(pInfo->hddw));
tufaqing 2010-06-11
  • 打赏
  • 举报
回复

int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs");

DOCDATAINFO ddi;
if(ParseData(L"C:\\a.txt", &ddi))
{
time_t job_date = ddi.job_date;
char *date = ctime(&job_date);

printf("HDDW: %u\n", ddi.hddw);
printf("COPIES: %u\n", ddi.copies);
printf("PAGEWIDTH: %u\n", ddi.page_width);
printf("PAGELENGTH: %u\n", ddi.page_length);
printf("PAGECOUNT: %u\n", ddi.page_count);
printf("COLOR: %u\n", ddi.color);
printf("DUPLEX: %u\n", ddi.duplex);
printf("JOBDATE: %u - %s\n", ddi.job_date, date);
printf("JOBCOST: %u\n", ddi.job_cost);
printf("JOBSIZE: %u\n", ddi.job_size);
printf("PORTTYPE: %u\n", ddi.port_type);
printf("AUDITOR_ID: %u\n", ddi.auditor_id);
printf("DOCUMENT: %S\n", ddi.document);
printf("ACCOUNT: %S\n", ddi.account);
printf("DOMAIN: %S\n", ddi.domain);
printf("LOCATION: %S\n", ddi.location);
printf("IP: %S\n", ddi.ip);
printf("GROUPNAME: %S\n", ddi.group_name);
printf("DEVICENAME: %S\n", ddi.device_name);
printf("PORTNAME: %S\n", ddi.port_name);
printf("PORT: %S\n", ddi.port);
printf("DRIVER: %S\n", ddi.driver);
printf("WKS_IP: %S\n", ddi.wks_ip);
}

return 0;
}
tufaqing 2010-06-11
  • 打赏
  • 举报
回复
LZ还是要多练习啊!

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <locale.h>

struct DOCDATALIST
{
WORD name_len;
WORD data_len;
BYTE *name;
BYTE *data;
DOCDATALIST *next;
};

struct DOCDATAINFO
{
WORD hddw;
DWORD copies;
DWORD page_width;
DWORD page_length;
DWORD page_count;
DWORD color;
DWORD duplex;
DWORD job_date;
DWORD job_cost;
DWORD job_size;
DWORD port_type;
DWORD auditor_id;
WCHAR document[MAX_PATH];
WCHAR account[MAX_PATH];
WCHAR domain[MAX_PATH];
WCHAR location[MAX_PATH];
WCHAR ip[MAX_PATH];
WCHAR group_name[MAX_PATH];
WCHAR device_name[MAX_PATH];
WCHAR port_name[MAX_PATH];
WCHAR port[MAX_PATH];
WCHAR driver[MAX_PATH];
WCHAR wks_ip[MAX_PATH];
};

static void swap_bytes(void *p, int len)
{
unsigned char *s = (unsigned char *)p;
unsigned char *e = (unsigned char *)p + len - 1;
while(s < e)
{
*s ^= *e; *e ^= *s; *s ^= *e;
s++; e--;
}
}

DOCDATALIST *CreateDocDataList(WCHAR *pFileName)
{
if(pFileName == NULL)
{
return NULL;
}

HANDLE hFile = CreateFileW(pFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}

DOCDATALIST *pList = NULL;
DOCDATALIST *pNode = NULL;

while(1)
{
WORD nNameLen = 0;
WORD nDataLen = 0;
BYTE *pName = NULL;
BYTE *pData = NULL;

DWORD nReadBytes = 0;

ReadFile(hFile, &nNameLen, 2, &nReadBytes, NULL);
if(nNameLen == 0 || nReadBytes < 2)
{
break;
}

swap_bytes(&nNameLen, 2);

pName = new BYTE[nNameLen];

ReadFile(hFile, pName, nNameLen, &nReadBytes, NULL);
if(nReadBytes < nNameLen)
{
delete[] pName;
break;
}

ReadFile(hFile, &nDataLen, 2, &nReadBytes, NULL);
if(nDataLen == 0 || nReadBytes < 2)
{
delete[] pName;
break;
}

swap_bytes(&nDataLen, 2);

pData = new BYTE[nDataLen];

ReadFile(hFile, pData, nDataLen, &nReadBytes, NULL);
if(nReadBytes < nDataLen)
{
delete[] pName;
delete[] pData;
break;
}

if(pList == NULL)
{
pNode = new DOCDATALIST;
pList = pNode;
pNode->name_len = nNameLen;
pNode->data_len = nDataLen;
pNode->name = pName;
pNode->data = pData;
pNode->next = NULL;
}
else
{
pNode->next = new DOCDATALIST;
pNode->next->name_len = nNameLen;
pNode->next->data_len = nDataLen;
pNode->next->name = pName;
pNode->next->data = pData;
pNode->next->next = NULL;
pNode = pNode->next;
}
}

CloseHandle(hFile);

return pList;
}

void DestroyDocDataList(DOCDATALIST *pList)
{
while(pList != NULL)
{
DOCDATALIST *pNext = pList->next;

if(pList->name_len)
{
delete[] pList->name;
}
if(pList->data_len)
{
delete[] pList->data;
}
delete pList;

pList = pNext;
}
}

BOOL ParseData(WCHAR *pFileName, DOCDATAINFO *pInfo)
{
DOCDATALIST *pList = CreateDocDataList(pFileName);
if(pList == NULL)
{
return FALSE;
}

memset(pInfo, 0, sizeof(DOCDATAINFO));

DOCDATALIST *pNode = pList;
while(pNode != NULL)
{
if((pNode->name_len == sizeof("HDDW")) && (memcmp(pNode->name, "HDDW", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->hddw))
{
memcpy(&pInfo->hddw, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"COPIES")) && (memcmp(pNode->name, L"COPIES", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->copies))
{
memcpy(&pInfo->copies, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGEWIDTH")) && (memcmp(pNode->name, L"PAGEWIDTH", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_width))
{
memcpy(&pInfo->page_width, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGELENGTH")) && (memcmp(pNode->name, L"PAGELENGTH", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_length))
{
memcpy(&pInfo->page_length, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGECOUNT")) && (memcmp(pNode->name, L"PAGECOUNT", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_count))
{
memcpy(&pInfo->page_count, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"COLOR")) && (memcmp(pNode->name, L"COLOR", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->color))
{
memcpy(&pInfo->color, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DUPLEX")) && (memcmp(pNode->name, L"DUPLEX", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->duplex))
{
memcpy(&pInfo->duplex, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBDATE")) && (memcmp(pNode->name, L"JOBDATE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_date))
{
memcpy(&pInfo->job_date, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBCOST")) && (memcmp(pNode->name, L"JOBCOST", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_cost))
{
memcpy(&pInfo->job_cost, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBSIZE")) && (memcmp(pNode->name, L"JOBSIZE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_size))
{
memcpy(&pInfo->job_size, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORTTYPE")) && (memcmp(pNode->name, L"PORTTYPE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->port_type))
{
memcpy(&pInfo->port_type, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"AUDITOR_ID")) && (memcmp(pNode->name, L"AUDITOR_ID", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->auditor_id))
{
memcpy(&pInfo->auditor_id, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DOCUMENT")) && (memcmp(pNode->name, L"DOCUMENT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->document))
{
memcpy(pInfo->document, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"ACCOUNT")) && (memcmp(pNode->name, L"ACCOUNT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->account))
{
memcpy(pInfo->account, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DOMAIN")) && (memcmp(pNode->name, L"DOMAIN", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->domain))
{
memcpy(pInfo->domain, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"LOCATION")) && (memcmp(pNode->name, L"LOCATION", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->location))
{
memcpy(pInfo->location, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"IP")) && (memcmp(pNode->name, L"IP", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->ip))
{
memcpy(pInfo->ip, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"GROUPNAME")) && (memcmp(pNode->name, L"GROUPNAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->group_name))
{
memcpy(pInfo->group_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DEVICENAME")) && (memcmp(pNode->name, L"DEVICENAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->device_name))
{
memcpy(pInfo->device_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORTNAME")) && (memcmp(pNode->name, L"PORTNAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->port_name))
{
memcpy(pInfo->port_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORT")) && (memcmp(pNode->name, L"PORT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->port))
{
memcpy(pInfo->port, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DRIVER")) && (memcmp(pNode->name, L"DRIVER", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->driver))
{
memcpy(pInfo->driver, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"WKS_IP")) && (memcmp(pNode->name, L"WKS_IP", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->wks_ip))
{
memcpy(pInfo->wks_ip, pNode->data, pNode->data_len);
}
}

pNode = pNode->next;
}

DestroyDocDataList(pList);

swap_bytes(&pInfo->hddw, sizeof(pInfo->hddw));
swap_bytes(&pInfo->copies, sizeof(pInfo->copies));
swap_bytes(&pInfo->page_width, sizeof(pInfo->page_width));
swap_bytes(&pInfo->page_length, sizeof(pInfo->page_length));
swap_bytes(&pInfo->page_count, sizeof(pInfo->page_count));
swap_bytes(&pInfo->color, sizeof(pInfo->color));
swap_bytes(&pInfo->duplex, sizeof(pInfo->duplex));
swap_bytes(&pInfo->job_date, sizeof(pInfo->job_date));
swap_bytes(&pInfo->job_cost, sizeof(pInfo->job_cost));
swap_bytes(&pInfo->job_size, sizeof(pInfo->job_size));
swap_bytes(&pInfo->port_type, sizeof(pInfo->port_type));
swap_bytes(&pInfo->auditor_id, sizeof(pInfo->auditor_id));

return TRUE;
}
tufaqing 2010-06-10
  • 打赏
  • 举报
回复
JOBDATE是时间,相对于1970/1/1过了多少秒(通过time(NULL)取得),可以用gmtime转换年月日(标准时间),或ctime输出时间字符串(系统时间)。
DOCUMENT和其它的一些描述都是unicode编码的,直接new WCHAR[n],memcpy到这个内存就行了。
kingmax54212008 2010-06-10
  • 打赏
  • 举报
回复
to tufaqing,
惊叹!
太厉害了。
对于那段中文与时间,你是怎么解析出来的?

JOBDATE: 0x4c0f62cb(2010/5/9 9:45:47,中国时间17:45:47)
DOCUMENT: Microsoft Word - _中国医学科学院医学自助文印系统修改建议及存在问题汇总.doc.doc
tufaqing 2010-06-10
  • 打赏
  • 举报
回复
我是对照文件人工解析的,没有写代码,自己写一下也比较简单。
00 05 (描述名长度为5)
48 44 44 57 00 (描述名为HDDW)
00 02 (内容长度为2)
00 01 (short 1)

00 0E (描述名长度为14)
43 00 4F 00 50 00 49 00 45 00 53 00 00 00 (描述名为COPIES)
00 04 (内容长度为4)
00 00 00 01 (long 1)

...
kingmax54212008 2010-06-10
  • 打赏
  • 举报
回复
在线等~~~
用户 昵称 2010-06-10
  • 打赏
  • 举报
回复
是utf16 little endian格式的,可是俺没恢复到1楼的程度,俺这边有很多字符是不可显示的。
kingmax54212008 2010-06-10
  • 打赏
  • 举报
回复
楼上的高手啊。
能把你解析出这些数据的例子给我发过来一下么?
kingmax5421#gmail.com (@代替#)
tufaqing 2010-06-10
  • 打赏
  • 举报
回复
定义的一段数据结构,每个字段是两个字节表示长度,后面是内容。

HDDW: 1
COPIES: 1
PAGEWIDTH: 0x86f
PAGELENGTH: 0xaea
COLOR: 2
DUPLEX: 1
ACCOUNT: jimmy
DOMAIN: SPC-8A9AEA324B0
GROUPNAME: DEFAULT
DEVICENAME: Xerox3200
LOCATION: \\SPC-8A9AEA324B0
PORTNAME: USB001
JOBDATE: 0x4c0f62cb(2010/5/9 9:45:47,中国时间17:45:47)
PAGECOUNT: 1
JOBCOST: 0
DOCUMENT: Microsoft Word - _中国医学科学院医学自助文印系统修改建议及存在问题汇总.doc.doc
JOBSIZE: 0x368f
PORTTYPE: 3
IP: SPC-8A9AEA324B0
PORT: USB001
DRIVER: Xerox Phaser 3200MFP PCL 6
AUDITOR_ID: 0
WKS_IP: 192.168.1.179
kingmax54212008 2010-06-10
  • 打赏
  • 举报
回复
这是不是C++里面所谓的序列化,
我的处理是反序列化,有没有这方面的经典例子或参照 ?
kingmax54212008 2010-06-10
  • 打赏
  • 举报
回复
to tufaqing,

sounds great. I will have a try!
请先阅读帮助文档:http://ismyway.com/help [2009.1.1] Ver 3.2.26 ※如果安装提示证书过期或无法安装,请在手机上将时间改为2008.8.8,安装设置完成后再将日期改回即可!※ 增加天语的按键映射 增加三星的背景灯控制功能(该功能未在真机上测试过) 删除图片浏览中的部分功能,由于这部分功能需要较大的内存,导致在大部分手机上无法完成,同时也引起背景图片无法设置成功 触摸屏用户可以不再受滚动条限制,在屏幕上任意地方都可以进行拖动 选择键盘映射为其它时无法再次更改的BUG 用户输入的颜色值无法保存的BUG 修正英文单词分词时会多添加一个空行的BUG 繁体语言措词上的修正 阅读设置中增加一个“文件缓存”选项,默认情况下是开启的,在NOKIA手机上会提高UMD等文件的表现,但由于测试并不充足,如果程序经常在阅读时出错,请关闭该选项(其它手机是否开启该选项并无明显的影响) 修正编辑文件后无法保存的BUG [2008.10.27] Ver 3.2.24 ※如果安装提示证书过期或无法安装,请在手机上将时间改为2008.8.8,安装设置完成后再将日期改回即可!※ 改进的颜色选择方式 允许用户重新选择键盘映射 HTML阅读时的错误 进一步完善编辑功能(仍有少许BUG,请继续反馈,谢谢) 新建文件后自动跳转到编辑中 改进的文件操作方式,速度轻微提升 UMD速度明显提升,并且减少内存占用,特别是在NOKIA手机上,表现提升超过600% 改进的输入框模式,以使得能适应更多的手机如天语等 [2008.10.21] Ver 3.2.23 为了提高运行效率,以下功能在LITE上将被取消(自定义欢迎页问候语;欢迎页背景图) 取消了JAR的支持,提高运行效率 修正打开大ZIP文件时的内存溢出错误 ·修正:  自动滚屏到末尾时,滚屏功能将停止 [2008.10.4] Ver 3.2.22 暂时删除了播放功能及网络相关的功能,由于以上两项功能一直没有能稳定下来,故暂时删除 增强了ZIP功能,支持带文件夹结构的ZIP/JAR文件 (对于大部分JAR电子书都,可以从文件管理器中找到非.class结尾的文件,并且选择打开为UNICODE/TXT阅读) (对于NOKIA手机及其它部分手机,由于安全策略的限制,在Anyview的文件管理器中无法查看后缀为.jar的文件) 自定义问候语(系统路径下dictum.rc文件,格式参见jar包中的dictum.rc文件,保存时使用UTF-8编码,可写条目为0~9/a~z/A~Z,置空时表示不显示问候语) ·修正:  0键在各偏好中切换时亮度混乱的问题  部分手机上无法新建文件夹 [2008.9.11] Ver 3.2.21 修正动画参数无法保存的BUG 动画效果不再对阅读翻页有作用 [2008.8.29] Ver 3.2.21 可将正在阅读的内容通过短信与好友分享 增加一种新的滚屏方式:波浪,同时,阅读时3键不再使用默认的像素滚屏,而会使用最后一次使用的滚屏方式 任何可用的外置字库都可以作为内置字库存在,在jar包中存在dot.font会被当为内置字库加载 加快大文件的打开速度,特别是对于NOKIA手机,S60上,打开20M文件,97%左右的位置不超过15秒 允许用户打开动画效果 ·M600/P990/P1/W950  修正键盘映射时“内存不足”的BUG ·E680/A780  选中后台播放后无法启动的BUG [2008.7.30] Ver 3.2.20 调整部分索爱手机上背景灯控制的逻辑 修正看图片时按0键出错的BUG 旋转屏幕引起的字外出 打开LRC最后出错 阅读到尾部弹出“上一个/下一个”窗口中的文件名过长不刷新的问题 偏好切换时亮度混乱的问题 在NOKIA上,当系统路径设置为根目录是无法启动的BUG E398上可以开关键盘灯 UIQ系统在退出时可以保持亮度 索爱上按“返回”键后导致阅读出现白屏的BUG 阅读时切换屏幕方向导致字体超出屏幕的BUG 欢迎屏幕上的日期使用中文显示 如果使用触屏手机,跳转改为进度条模式,以方便触屏操作 系统路径下如果存在bg.png文件,则会作为欢迎界面的背景图片显示(右下角) 减少跳转及翻页中出现乱码的机率 提高阅读时绘图效率,滚屏效率同样提高 播放时,暂停会导致声音爆至最大的BUG 内置“忘记月亮”制作的两款主题《典雅红》《黑橙》,并且更换主题不再要求退出 文件管理器中支持“剪切”功能 文件管理器中新增转换UMD为TXT的功能(解开操作,解开2无效!) 增加了编辑功能(尽管没有限制文件大小,但请别编辑过大的文件,另外,为了提高速度,不进行全文排版,有时候表现可能会有些不习惯),以后会进一步完善 启动时,会自动识别NOKIA、SONYER

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧