A. 说明TMS320 VC 5509A的MMC接口和USB接口,主要应用在哪些方面
按照DSP常识介绍、开发环境、内部寄存器、外设、开发实例的顺序展开。并按照DSP系统设计的一般流程,以一个音频处理DSP系统为例,从原理图
B. CCS8.0中没有TMS320VC5509A可以用TMS320C5509A代替吗
①、关于以上这【CCS8.0中没有TMS320VC5509A可以用TMS320C5509A代替吗】?
②、向上述两款数字信号处理器因型号的不同,建议还是别代替了,原因是,两款处理器型号不同的话,内部的信号程序处理和引脚功能可能略有不同,所以一定要查好两款芯片的背景资料后,对比一下就明白了。仅供参考
C. 单片机对讲机原理
方案一 以单片机为核心处理器的DMR对讲机方案(MSP430F149+AMBE1000)
1.工作原理
发射时,由麦克送来的模拟语音经CSP1027进行A/D转换,由声码器AMBE1000进行语音压缩,交单片机MSP430F149进行协议填充组帧,送到CC1101进行调制后发射。接收时,由CC1101解调出来的码流经MSP430F149进行帧恢复,交由声码器进行解压,数据经CSP1027进行D/A转换为模拟语音信号。
2.关键器件
微控制器采用TI公司的MSP430F149,它是16位超低功耗、混合信号微控制器,采用“冯·诺依曼”结构,可用JTAG(一种标准测试接口)进行仿真调试。
芯片的电源电压为(1.8~3.6)V,在RAM数据保持方式下耗电仅0.1uA,活动模式耗电250 uA/MIPS(每秒百万条指令数)。运算时由于本单片机采用16位RISC(精简指令集计算机),一个时钟周期可以执行一条指令,而传统的单片机要12个时钟周期才执行一条指令。工作在8MHz的晶振频率时,指令速度可达8MIPS,而同样这个指令速度,16位处理器比8位处理器高远不止两倍。
概述
声码器AMBE1000在国内已有产品,价格比较合理。CC1101的灵敏度为-116dBm(1.2kbps,1%数据包误码率,工作在433MHz时),与国内的对讲机可用灵敏度-120dBm相比偏低,但符合欧盟的CE标准规定小于-107dBm.另外,射频模块的功率输出仅12dBm(16mW),所以本方案仅适用短距离范围的通信。提高灵敏度可考虑用器件ADF7021作为射频模块。
方案二 以DSP+MCU为核心处理器的对讲机方案
1.工作原理
方案以MSP430为中心系统来完成数据的收、发控制等工作,系统采用MSP430中 USART模块的SPI同步通信模式。在接收过程中,首先接收来自射频芯片的FSK数据,解调后由MSP430将数据帧的同步域、尾域、ID域以及命令字节去除后,数据发至C5402进行去压缩处理,数据交AIC23进行D/A转换为语音信号。在发送过程中,首先由AIC23进行A/D转换,数据交C5402将语音压缩,再由微控制器MSP430进行协议填充,加上头域、尾域、ID域以及命令字节形成数据帧,然后控制射频模块将数据发送。
2.关键器件
TMS320C5402是TI公司于1996年推出的一种定点DSP芯片,采用先进的修正哈佛结构和8总线结构,使处理器的性能大大提高。其独立的程序和数据总线允许同时访问程序存储器和数据存储器,实现高速并行操作。如,可以在一条指令中同时执行3次读操作和1次写操作。TMS320C5402的运行速度为40MIPS,指令周期为25ns.此外,还可以在数据总线与程序总线之间相互传送数据。从而使处理器具有单个周期内同时执行算术运算、逻辑运算、位移操作、乘法累加运算以及访问程序、数据存储等强大功能。
概述
采用DSP方案时,免去选用语音芯片声码器的烦恼,提高了数字对讲机对语音处理的能力,可让语音编码的算法尽量优化,从而使对讲机语音信号的处理更具通用性和扩展性。本方案是以DSP为开发平台,经过连续可变斜率增量(CVSD)调制编解码得到语音信号的清晰度和自然度好,但软件开发工作量大。CC1000不支持4FSK调制与解调,本方案不适用于DMR与dPMR协议。另外CC1000的接收可用灵敏度为-110dBm,国内对讲机厂家可能嫌低。
方案三 以单片机为核心处理器的dPMR对讲机方案(CMX618+CMX7141)
1.工作原理
发射时,麦克送来的模拟语音经CMX618内部进行增益调节,A/D转换和压缩处理,然后通过SPI(串行外围设备接口)进入CMX7141基带处理器,在微控制器LPC2138的控制和管理下经CMX7141芯片内部进行信道编码,dPMR协议栈打包,数字滤波以及4FSK调制,调制编码后的语音数据经CMX7141芯片的MOD1/2管脚分别输出给外部的发射VCO和压控温补参考时钟,经两点调制输出射频载波给发射功放,并到天线输出。
接收时,CMX7141对基于超外差射频接收模块送来的4FSK解调信号在微控制器LPC2138的控制和管理下进行4FSK解调,dPMR拆包,信道解码,最终得到语音编码数据,经SPI串口送给CMX618进行语音解压缩并恢复语音信号。
2.关键器件
语音编解码片CMX618是CML微电子(新加坡)私人有限公司的产品,芯片由音频压缩/解压器、RALCWI编解码器、前向纠错编解码器和其他特殊功能模块几部分组成。
RALCWI是一种鲁棒的先进的复杂性波形插入技术,与其他语音编解码技术不同,它使用独有的信号分解和参数编码方法,可确保在较高的压缩率下有较好的语音质量。
在声码器中,采用RALCWI技术实现的语音质量与编码速率在4kbps以上的标准声码器话音质量相当。
概述
本方案优点是开发时的灵活性高,模拟与数字可双模设计,且同一个硬件开发平台能满足不同的数字对讲机标准,支持多种语音声码器,射频的接收灵敏度可做得较高达到-118dBm(误码率为1%时)。发射功率0.5W,功率容易提升。
缺点是前期的软件开发成本高并有一定难度,射频模块ATB010只支持dPMR的EN301,166标准,不支持DMR.
方案四 以MCU+DSP的DMR对讲机方案(MSP430FG4619+VC5510)
1.工作原理
发射时,由麦克送来的模拟语音经模数转换器AD73311采样成数字信号,AMBE2000对语音数字信号进行压缩编码,数字信号由VC5510进行DMR通信协议填充组成帧信号和4FSK的调频波成形,最后由微控制器MCU进行D/A转换,送往射频模块进行发射调制,实现发射。
接收时,MCU将射频模块送来已解调数据进行A/D转换,经VC5510进行拆帧,交AMBE2000进行解压,数据由AD73311数模转换为语音信号。
微控制器MSP430FG4619是整个系统的控制中心,人机接口如键盘、显示器与MCU直接连接。微控制器实现对射频模块的控制,包括基带信号的发送与接收、射频频率点的控制、信道检测等,MCU还负责DMR协议的高层信令控制、人机接口的互通等。
另外,请注意微控制器还要完成基带信号的AD/DA转换功能。
2.关键器件
AMBE2000TM声码器是美国语音公司DVSI推出的一款适应性强、高性能、单芯片的语音压缩编解码器。它能在低速率下提供优良的语音质量,并实现了实时的、全双工的标准设定的AMBE语音压缩软件算法。
大量的评估显示,这款声码器具有在一般数据速率下提供同数字蜂窝系统一样性能的能力。AMBE在2.4kbps速率下保持自然语音质量和清晰度,由于AMBE算法复杂性低,所以它能够完全集成在成本低、功耗低的芯片上。
概述
方案简单,实用。
软件开发中,微控制器和数字处理器的程序对DMR协议的分层必须有清晰的概念,正确的程序设计是硬件实现的保证。声码器的选用有较大的余地。
方案五 以ARM+DSP的DMR对讲机方案
1.工作原理
发射时,由麦克送来的话音信号由数模转换器AD73311进行采样,数据由声码器进行压缩,OMAP5910内的DSP与ARM对压缩的数据进行协议添加与控制,形成4FSK波形,数模转换器AIC23将4FSK数字波形模拟化后进行射频调制,调频载波由天线发射。
接收时,射频模块对接收的模拟信号进行解调,模拟信号交AIC23进行数字化处理,OMAP5910对接收到的数据进行信道解码和拆帧,帧信号交声码器进行解压,数据由AD73311还原为模拟语音信号。
2.关键器件
OMAP5910是一款嵌入式双核处理器,它集成了高性能的ARM925、TMS320C55x DSP核和已经得到的广泛应用的各种接口与外设,具有较强的处理能力、较低的功耗和较高的信价比。ARM处理器内核用于DMR协议的处理与系统控制,DSP内核用于完成数字信号的实时处理。
OMAP5910及其设计套件具有多个目标应用市场,提供多媒体功能、改善人机界面并延长电池寿命。
概述
从技术上讲,双核处理器方案与前面介绍的DSP+MCU相比,可以降低系统体积,减少电路的复杂性,对通信协议能作较好的兼容,升级空间大。声码器的应用有可选国产芯片的余地。
缺点是前期的软件开发工作量大,ARM与DSP间的协调工作要深入研究,以免浪费处理器的资源。此外,由于OMAP的功能十分强大,该平台还可以有更多的应用,如加入视频、娱乐等功能。
方案六
1.工作原理
发射时,麦克送来的模拟语音经WM8758B进行A/D转换,送到SCT3252进行压缩处理,经SCT3252进行dPMR协议处理后送到WM8758B的D/A转换单元调制成4FSK信号,经两点调制输出射频载波给发射功放,送天线输出。
接收时,WM8758B对射频模拟信号进行A/D转换,送到SCT3252进行4FSK解调,dPMR拆包,信道解码,最终得到语音编码数据,经解码处理后把语音数据送到WM8758B进行D/A转换,经由外部放大电路送入喇叭还原成话音。
2.关键器件
SCT3252是上海士康公司生产的语音编解码及dPMR协议栈处理芯片。具有较好的语音质量及较高的接收灵敏度(可达-126dBm)。
概述
本方案的特点是语音编解码及dPMR协议栈都集成在SCT3252中,大大减少了控制单元MCU的工作量,另外SCT3252为LQFP100封装,焊接方便。整个方案简单,软件升级的空间大。本方案可以实现数模兼容,通过开关可方便进行数字与模拟通信之间的切换。
WM8758B只起模数转换作用,厂家认为,把它集成进SCT3252是指日可待的事。
D. 跪求一个VC++编写的文件夹加密软件代码(要完整代码 o(∩_∩)o...)
// AesCodeDlg.cpp : implementation file
//
#include "stdafx.h"
#include "AesCode.h"
#include "AesCodeDlg.h"
#include "Aes.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAesCodeDlg dialog
CAesCodeDlg::CAesCodeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CAesCodeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAesCodeDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CAesCodeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAesCodeDlg)
DDX_Control(pDX, IDC_EnDeProg, m_prog);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAesCodeDlg, CDialog)
//{{AFX_MSG_MAP(CAesCodeDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BAesEn, OnBAesEn)
ON_BN_CLICKED(IDC_BAesDe, OnBAesDe)
ON_BN_CLICKED(IDC_BFile, OnBFile)
ON_BN_CLICKED(IDC_BFileEn, OnBFileEn)
ON_BN_CLICKED(IDC_BFileDe, OnBFileDe)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAesCodeDlg message handlers
BOOL CAesCodeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
SetDlgItemText(IDC_EAesEn,"0123456789abcdef");
EnDe_filename="";
m_prog.SetRange(0,100);
m_prog.SetPos(0);
return TRUE; // return TRUE unless you set the focus to a control
}
void CAesCodeDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CAesCodeDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CAesCodeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes字符串加密
void CAesCodeDlg::OnBAesEn()
{
// TODO: Add your control notification handler code here
unsigned char inBuff[25],ouBuff[25];
memset(inBuff,0,25);
memset(ouBuff,0,25);
Aes aes(24,(unsigned char*)"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17");
GetDlgItemText(IDC_EAesEn,(char*)inBuff,24);
if(strlen((char*)inBuff)>16)MessageBox("本例只能加密16字节的字符串,大于截断");
aes.Cipher(inBuff,ouBuff); //因为输出为16个字节,每个字节用两个字母或数字表示。
CString str="",strTmp; //实际输出是32个字母或数字,否则ASCII码值超出127的会变成乱码。
for(int i=0;i<16;i++)
{
strTmp.Format("%02x",ouBuff[i]); //其实相当于把ouBuff的ASCII值这个数字以16进制的形式输出
str+=strTmp;
}
//MessageBox(str,"加密后");
SetDlgItemText(IDC_EAesEn,str);
}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes字符串解密
void CAesCodeDlg::OnBAesDe()
{
// TODO: Add your control notification handler code here
unsigned char inBuff[33],ouBuff[25]; //还是要注意32个字符的字符串需要用33个字节来存储,
//因为有个结束符,太恶心了
memset(inBuff,0,32);
memset(ouBuff,0,25);
Aes aes(24,(unsigned char*)"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17");
GetDlgItemText(IDC_EAesEn,(char*)inBuff,33);
unsigned char temp[25];
for(int j=0;j<16;j++)
{
temp[j]=char2num(inBuff[2*j])*16+char2num(inBuff[2*j+1]);// 将字符字面表示的16进制ASCII码值转换成真正的ASCII码值
}
aes.InvCipher(temp,ouBuff);//"dda97ca4......ec0d7191"
SetDlgItemText(IDC_EAesDe,CString(ouBuff));
}
////////////////////////////////////////////////////////////////////////////////////////////////
//字符ASCII码值到字符字面值的转换 如 '0'转换成0, 'a'转换成10
int CAesCodeDlg::char2num(char ch)
{
if(ch>='0'&&ch<='9')return ch-'0';
else if(ch>='a'&&ch<='f')return ch-'a'+10;
return -1;
}
////////////////////////////////////////////////////////////////////////////////////////////////
//文件选择框
void CAesCodeDlg::OnBFile()
{
// TODO: Add your control notification handler code here
CFileDialog fdlg(1,NULL,NULL,OFN_HIDEREADONLY ,"All Files(*.*)|*.*||");
if(IDOK!=fdlg.DoModal())return;
EnDe_filename=fdlg.GetPathName();
SetDlgItemText(IDC_EFile,EnDe_filename);
}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes文件加密
void CAesCodeDlg::OnBFileEn()
{
// TODO: Add your control notification handler code here
if(EnDe_filename=="")return;
FILE* finput;
FILE* foutput;
finput=fopen((LPCTSTR)EnDe_filename,"rb");
if(!finput)
{
MessageBox("文件打开错误","出错",MB_OK);
return;
}
fseek(finput,0,SEEK_END);
long lFileLen=ftell(finput); //ftell()函数返回文件位置指示符的当前值,即如果现在是在文件结尾,则这个值就是文件长度
fseek(finput,0,SEEK_SET);
long blocknum=lFileLen/16;
long leftnum=lFileLen%16;
EnDe_filename+=".en";
foutput=fopen((LPCTSTR)EnDe_filename,"wb");
if(!foutput)
{
MessageBox("文件打开错误","出错",MB_OK);
fclose(finput);
return;
}
unsigned char inBuff[25],ouBuff[25];
Aes aes(16,(unsigned char*)"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf");
for(long i=0;i<blocknum;i++)
{
fread(inBuff,1,16,finput); //读取16个对象,每个对象的长度是1字节
aes.Cipher(inBuff,ouBuff);
fwrite(ouBuff,1,16,foutput);
m_prog.SetPos(int(100*i/blocknum)); //加密进度条进度设置
}
if(leftnum)
{
memset(inBuff,0,16);
fread(inBuff,1,leftnum,finput);
aes.Cipher(inBuff,ouBuff);
fwrite(ouBuff,1,16,foutput);
}
fclose(finput);
fclose(foutput);
MessageBox("加密成功!");
SetDlgItemText(IDC_EFile,EnDe_filename);
m_prog.SetPos(0);
}
////////////////////////////////////////////////////////////////////////////////////////////////
//Aes文件解密
void CAesCodeDlg::OnBFileDe()
{
// TODO: Add your control notification handler code here
if(EnDe_filename=="")return;
FILE* finput;
FILE* foutput;
finput=fopen((LPCTSTR)EnDe_filename,"rb");
if(!finput)
{
MessageBox("文件打开错误","出错",MB_OK);
return;
}
fseek(finput,0,SEEK_END);
long lFileLen=ftell(finput); //ftell()函数返回文件位置指示符的当前值,即如果现在是在文件结尾,则这个值就是文件长度
fseek(finput,0,SEEK_SET);
long blocknum=lFileLen/16;
long leftnum=lFileLen%16;
EnDe_filename+=".de";
foutput=fopen((LPCTSTR)EnDe_filename,"wb");
if(!foutput)
{
MessageBox("文件打开错误","出错",MB_OK);
fclose(finput);
return;
}
unsigned char inBuff[25],ouBuff[25];
Aes aes(16,(unsigned char*)"\x0\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf");
for(long i=0;i<blocknum;i++)
{
fread(inBuff,1,16,finput); //读取16个对象,每个对象的长度是1字节
aes.InvCipher(inBuff,ouBuff);
fwrite(ouBuff,1,16,foutput);
m_prog.SetPos(int(100*i/blocknum)); //加密进度条进度设置
}
if(leftnum)
{
MessageBox("文件可能已损坏或非经aes加密过");
}
fclose(finput);
fclose(foutput);
MessageBox("解密成功!");
SetDlgItemText(IDC_EFile,EnDe_filename);
m_prog.SetPos(0);
}
要源程序和全部代码给我邮箱我给你发过去。
E. VC 简单加密!
#include <stdio.h>
#include <string.h>void main()
{
char a[50] = "加密~!中英文都要支持!越简单越好!";//原文
char b[50];
char key[5] = "abcd\0";//密钥
int i, j; printf("原文:%s\n\n", a);
printf("密钥:%s\n\n", key); for (i = 0; i < strlen(a); i ++)
{
for (j = 0; j < 4; j ++)
{
b[i] = a[i] ^ key[j];//将每一个原文字符跟密钥字符异或
}
}
b[i] = 0;//结束字符串
printf("加密后:%s\n\n", b); for (i = 0; i < strlen(a); i ++)
{
for (j = 3; j >= 0; j --)
{
b[i] = b[i] ^ key[j];
}
}
printf("解密后:%s\n\n", a);
}
F. TMS320VC5509APGE与TMS320VC5509A什么区别
TMS320VC5509A是指一个系列的电路,它们都具有相同的外设、RAM容量等等。TMS320VC5509APGE是器件的具体型号,PGE是指芯片封装,这个应该是144脚扁平贴片,4边出长引脚。
其它的还有AGHH后缀的,代表BGA封装,就是在芯片底部出锡球引脚。
这两种芯片的调试方法、功能、RAM容量、外设等全部一样,只是管脚封装数量、排布顺序不一致而已。(多出的管脚一般都是电源、地)
一般来说,购买器件时说明是TMS320VC5509APGE,就包含了封装信息,不会买错。如果只提TMS320VC5509A,那么就需要补充封装信息,否则买到的芯片焊不上,无法使用。
G. 使用高级语言(C、C++、C#语言)实现一个加密/解密程序,调试并通过该程序。
同意一楼的看法,要不你就要赫夫曼编码原理吧,这个比较简单,实现也比较容易;根据字符出现的频率作为字符权值,利用Huffman算法进行处理,形成Huffman树,得到Huffman码,利用Huffman码对字符进行加密,已二进制的形式存储到磁盘。 再利用Huffman码对加密后的文件解密。
#include<stdio.h>
typedef struct LNode{ /*-------------链表-------------------*/
int data;
struct LNode *next;
}LNode,*Linklist;
typedef struct Character{ /*-------------字符结构体-------------*/
char data; /*--------------字符值----------------*/
int frequency; /*-------------字符出现频率-----------*/
}Character;
typedef struct HTNode{ /*-------------哈夫曼接点-------------*/
char data; /*-------------接点值-----------------*/
unsigned int weight; /*--------------权值------------------*/
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
Linklist L; /*-------------链表头接点--------------*/
Character T[256]; /*-----存放信息中出现的字符(不含汉字)----*/
HuffmanTree HT; /*--------------存放哈夫曼接点--------------*/
char *HC[257],*HA[256]; /*------HC中紧密存放哈夫曼编码,HA中按字符值位置存放该字符的编码,如A存放于HA中第65号元---*/
int len=0; /*-------------信息中出现的字符数量-----------*/
int s1,s2;
int i,j;
char ch;
char Infile[10],Outfile[10],decfile[10]; /*------分别为源信息文件,加密后的2进制文件(解密源文件),解密后的文件------*/
FILE *fp,*fin,*fout;
void Create_L(int n) /*------对有n接点建一条带头接点的链表(头插法)-----*/
{
int i;
Linklist p,k;
L=(Linklist)malloc(sizeof(LNode));
k=L;
for(i=1;i<=n;i++)
{
p=(Linklist)malloc(sizeof(LNode));
p->next=NULL;
p->data=i;
k->next=p;k=p;
}
}
void Init() /*-------初始化,统计Infile中的字符数目len及每个字符出现的频率------*/
{ /*-------将这len个字符存于T[0]到T[len-1]中,然后按频率值将这len个字符按升序排列------*/
void QuickSort(Character A[],int p,int r);
printf("Input the Infilename:\n");
scanf("%s",Infile);
if((fp=fopen(Infile,"r"))==NULL)
{
printf("Cannot open Infile!\n");
exit(0);
}
for(i=0;i<256;i++)
{
T[i].data=i;
T[i].frequency=0;
}
while(!feof(fp))
{
ch=fgetc(fp);
T[ch].frequency++;
}
for(i=0,j=0;i<256;i++)
{
while(!T[i].frequency&&i<256)
T[i++].data=0;
if(i<256)
T[j++]=T[i];
}
len=j;
Create_L(len);
QuickSort(T,0,len-1);
fclose(fp);
}
void QuickSort(Character A[],int p,int r) /*--------冒泡法对A数组元素按频率升序排列---------*/
{
Character t;
for(i=p;i<r;i++)
for(j=p;j<r-i;j++)
if(A[j].frequency>A[j+1].frequency)
{
t=A[j]; A[j]=A[j+1]; A[j+1]=t;
}
}
void Select() /*------------取出链表的前两个权值最小的元素,将新增元素按升序规则插于链表-------*/
{
Linklist p,q;
int w,t;
p=L->next;
s1=p->data;
q=p->next;
s2=q->data;
w=HT[s1].weight+HT[s2].weight;
q->data=i;
L->next=q;
free(p);
while(q->next)
{
if(w>HT[q->next->data].weight)
{ t=q->data;q->data=q->next->data;q->next->data=t;}
q=q->next;
}
}
void HuffmanCoding(int n) /*-------对n种字符进行编码存于*HA[257]中---------*/
{
int m,c,f,start;
int lencd;
HuffmanTree p;
char *cd;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p)
{
p->data=T[i-1].data;
p->weight=T[i-1].frequency;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(;i<=m;++i,++p)
{
p->data=0;
p->weight=0;
p->parent=0;
p->lchild=0;
p->rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select();
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
cd=(char *)malloc(n*sizeof(char));
for(start=0;start<n;start++) cd[i]='\0';
for(i=1;i<=n;++i)
{
start=0;
for(c=i,f=HT[i].parent;f!=0;f=HT[f].parent,c=HT[c].parent)
{
if(HT[f].lchild==c)
cd[start++]='0';
else
cd[start++]='1';
}
lencd=start;
HC[i]=(char *)malloc((lencd+1)*sizeof(char));
ch=HT[i].data;
HA[ch]=(char *)malloc((lencd+1)*sizeof(char));
for(start=lencd-1,j=0;start>=0;start--)
{
HC[i][j]=cd[start];
j++;
}
HC[i][j]='\0';
strcpy(HA[ch],HC[i]);
}
free(cd);
}
void Encrytion() /*-------按HA中的编码把Infile文件中的每一个字符翻译成2进制文件存于outfile文件中----*/
{
printf("Input the outfilename:\n");
scanf("%s",Outfile);
if((fout=fopen(Outfile,"a"))==NULL)
{
printf("Cannot open outfile!\n");
exit(0);
}
if((fin=fopen(Infile,"r"))==NULL)
{
printf("Cannot open Infile in the Encrytion!\n");
exit(0);
}
while(!feof(fin))
{
ch=fgetc(fin);
fputs(HA[ch],fout);
}
fclose(fin);
fclose(fout);
}
void Decryption() /*--------对存于outfile文件中的密文解码,从哈夫曼树的根接点按0,1分别选择左右子树,
直到叶子接点,输出叶子接点值-----*/
{
int m=2*len-1;
if((fin=fopen(Outfile,"r"))==NULL)
{
printf("Cannot open sourcefile!\n");
exit(0);
}
printf("Input the decfile!\n");
scanf("%s",decfile);
if((fout=fopen(decfile,"a"))==NULL)
{
printf("Cannot open decfile!\n");
exit(0);
}
while(!feof(fin))
{
i=m;
while(HT[i].lchild&&HT[i].rchild)
{
ch=fgetc(fin);
if(ch=='0') i=HT[i].lchild;
else if(ch=='1') i=HT[i].rchild;
else
{
printf("END!\n");
exit(0);
}
}
printf("%c",HT[i].data);
fprintf(fout,"%c",HT[i].data);
}
fclose(fin);
fclose(fout);
}
/*----------------主函数----------------------*/
void main()
{
void Init(); /*---------------声明部分-------------------*/
void HuffmanCoding(int n);
void Encrytion();
void Decryption();
Init(); /*--------------初始化函数------------------*/
HuffmanCoding(len); /*--------------编码函数--------------------*/
Encrytion(); /*--------------加密函数--------------------*/
Decryption(); /*--------------解密函数--------------------*/
}
H. tms320vc5509a型dsp的cpu采用什么寄存器
一般的方法是1.
先在仿真器模式下调通应用程序,
这里要注意把gel文件的一些初始化配置搬移到应用程序中2.
用十六进制转换工具hex55.exe把.out文件转换成.hex文件或者.bin文件(.bin文件需要8bit
memory)3.
编写flash烧写程序,
并把步骤2中生成的.hex文件以数组的形式包含到flash烧写程序中或者直接读取.bin文件.
4.
flash烧写完毕后,
配置boot
mode管脚启动
I. VC++ DES加密了一段字符 怎么把这个加密后得到的密文转换为16进制
charszOutput[512]={0};
for(inti=0;i<len;i++){
sprintf(szOutput+i*2,"%.2x",(unsignedchar)out[i]);
}