其实也是一个加密码算法,具体
算法请参照网上相关资料。
'将8bit转为7bit
'E8 32 9B FD 46 97 D9 EC 37
Public Function Encrypt7To8(strSource As String) As String
Dim StrHex As String
Dim strRe As String
Dim StrBinary As String
Dim LngLength As Integer
Dim IntFirst As Integer
Dim newStrBinary As String
Dim newStrHex As String
Dim strResult As String
LngLength = Len(strSource)
StrHex = StringToHex(strSource) '16
strRe = StrRecovent(StrHex) '反转
StrBinary = From16To2(strRe, True) '16 to 2 7bit
IntFirst = 8 - (LngLength Mod 8)
If IntFirst <> 8 Then
newStrBinary = VBA.Right("00000000" & VBA.Left(StrBinary, IntFirst), 8) & VBA.Right(StrBinary, Len(StrBinary) - IntFirst)
Else
newStrBinary = StrBinary
End If
'2 to 16 8bit
newStrHex = From2To16(newStrBinary)
''反转
strResult = StrRecovent(newStrHex)
Encrypt7To8 = strResult
End FunctionPublic Function Decrypt8To7(strSource As String) As String
Dim intLength As Integer
Dim strRe As String
Dim strResult As String
Dim StrBinary As String
Dim newStrBinary As String
Dim Str8 As String
Dim newStrHex As String
Dim newRe As String
Dim strTemp As String
Dim i As Integer
intLength = Len(strSource) / 2
strRe = StrRecovent(strSource) '反转
StrBinary = From16To2(strRe, False) '16 to 2 8bit
If Len(StrBinary) Mod 7 <> 0 Then
'VBA.Right("0000000" & VBA.Left(StrBinary, (Len(StrBinary) Mod 7)), 7) &
newStrBinary = VBA.Right(StrBinary, (Len(StrBinary) - (Len(StrBinary) Mod 7)))
Else
newStrBinary = StrBinary
End If
Str8 = StrRe7to8(newStrBinary)
'2 to 16
newStrHex = From2To16(Str8)
''反转
newRe = StrRecovent(newStrHex)
''转为字符
For i = 1 To Len(newRe) / 2
strTemp = ChrW(CInt(Val("&H" & VBA.Mid(newRe, (i - 1) * 2 + 1, 2))))
strResult = strResult & strTemp
Next
Decrypt8To7 = strResult
End Function
算法请参照网上相关资料。
'将8bit转为7bit
'E8 32 9B FD 46 97 D9 EC 37
Public Function Encrypt7To8(strSource As String) As String
Dim StrHex As String
Dim strRe As String
Dim StrBinary As String
Dim LngLength As Integer
Dim IntFirst As Integer
Dim newStrBinary As String
Dim newStrHex As String
Dim strResult As String
LngLength = Len(strSource)
StrHex = StringToHex(strSource) '16
strRe = StrRecovent(StrHex) '反转
StrBinary = From16To2(strRe, True) '16 to 2 7bit
IntFirst = 8 - (LngLength Mod 8)
If IntFirst <> 8 Then
newStrBinary = VBA.Right("00000000" & VBA.Left(StrBinary, IntFirst), 8) & VBA.Right(StrBinary, Len(StrBinary) - IntFirst)
Else
newStrBinary = StrBinary
End If
'2 to 16 8bit
newStrHex = From2To16(newStrBinary)
''反转
strResult = StrRecovent(newStrHex)
Encrypt7To8 = strResult
End FunctionPublic Function Decrypt8To7(strSource As String) As String
Dim intLength As Integer
Dim strRe As String
Dim strResult As String
Dim StrBinary As String
Dim newStrBinary As String
Dim Str8 As String
Dim newStrHex As String
Dim newRe As String
Dim strTemp As String
Dim i As Integer
intLength = Len(strSource) / 2
strRe = StrRecovent(strSource) '反转
StrBinary = From16To2(strRe, False) '16 to 2 8bit
If Len(StrBinary) Mod 7 <> 0 Then
'VBA.Right("0000000" & VBA.Left(StrBinary, (Len(StrBinary) Mod 7)), 7) &
newStrBinary = VBA.Right(StrBinary, (Len(StrBinary) - (Len(StrBinary) Mod 7)))
Else
newStrBinary = StrBinary
End If
Str8 = StrRe7to8(newStrBinary)
'2 to 16
newStrHex = From2To16(Str8)
''反转
newRe = StrRecovent(newStrHex)
''转为字符
For i = 1 To Len(newRe) / 2
strTemp = ChrW(CInt(Val("&H" & VBA.Mid(newRe, (i - 1) * 2 + 1, 2))))
strResult = strResult & strTemp
Next
Decrypt8To7 = strResult
End Function
PSTR CShortMDlg::DataToStr(char *Databuf)
{
//8个字符为一段;
/*把每个字符要移到前一字符(第一字符除外)的位算出 */
int DataLen;
char DataTemp[200];
int i;
BYTE ChY[50],ChM[50],ChYM[50]; //依次为字符的HEX表示,与字符相与的数,移位后的数
BYTE Dest,Ch;
CString DataDest;
int Hi,Li; sprintf(DataTemp,"%s",Databuf);
DataLen=strlen(DataTemp);
for (i=0;i<DataLen;i++)
{
Ch=DataTemp[i]; //ASCII码
ChY[i]=Ch & (CalaMe(i%8) - 1); //与该位字符相 与 的数
ChM[i]=Ch >> (i%8); //字符的十六进制移位后的值
ChYM[i]=ChY[i] << (8-(i%8)); //把要移位的数转到最高位
}
for (i=0;i<DataLen-1;i++)
{
if (i==0 || ((i+1) % 8)!=0)
{
Dest=ChYM[i+1]+ChM[i];
Hi=Dest / 16;
Li=Dest % 16;
DataDest=DataDest+DecToHex(Hi)+DecToHex(Li);
}
}
if (ChM[DataLen]!=0)
{
Hi=ChM[DataLen-1] / 16;
Li=ChM[DataLen-1] % 16;
DataDest=DataDest+DecToHex(Hi)+DecToHex(Li);
}
sprintf(Databuf,"%s",DataDest);
return Databuf;
}
那WINDOWS XP的核心源码岂不是图片处理???
[email protected]
谢谢
ffish——胖胖鱼
你少见多怪,这是用手机模块收发短信,把要发送的字符压缩的算法
那为什么WINZIP和WINRAR这两只软件不能发短信呢?
GSM只支持ASCII码值从0X00到0X7F的128个字符,这些值只需要7bit去定义,而SMS报文是以8bit字节序列传输的,故GSM使用一种编码方式将7bitASCII码值序列压缩成8bit字节序列。其他的操作只是调用规定的命令就行了,所以说压缩字符就是核心,呵呵
也许你个人认为这只是一个压缩或者是个
加密算法罢了,但我想
如果用这手机收发短信上,它不单单是个算法。
只要是它是一种标准规则,没有这个规则我们不能
成功发送和接收短信。