?? numscalechange.cpp
字號:
/********************************************************************
created: 2006/03/06
created: 6:3:2006 10:31
filename: D:\Projects\phs msg\str2int\str2int.cpp
file path: D:\Projects\phs msg\str2int
file base: str2int
file ext: cpp
author: BryanJ
purpose: 將一個文件中16、8、2進制的ASCII字符串轉換成其它進制的
ASCII字符串.
注: 待轉換文件中除數字字符外只可有換行符,進制需要自行指定,
見numScaleSrc、numScaleDst
轉換順序是從高位開始,每12個二進制位作為一個整體進行轉換。
除轉換為二進制外,末尾不足12bit的將以0填充。
*********************************************************************/
//#include "StrToData.h"
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
//------------------------------------------------------------------------
#define MAX_STR_LENGTH 10240
//------------------------------------------------------------------------
int IsBitOn(unsigned int Value, unsigned int Bit)
{
return ( (Value & (1 << Bit)) != 0 );
}
//------------------------------------------------------------------------
int Byte2ASCIIBinary(unsigned int c, char* outStr, int bitSize)//僅轉換后bitSize個bit
{
int i = 0;
if (bitSize <= 0)
{
return -1;
}
for (i = 0; i < 16; i++)
{
outStr[i] = '0';
}
for (i = 0; i < bitSize; i++)
{
if (IsBitOn(c, i))
{
outStr[bitSize - 1 -i] = '1';
}
else outStr[bitSize - 1 -i] = '0';
}
outStr[bitSize] = '\0';
return 0;
}
//------------------------------------------------------------------------
long npf(int d,int n)
{
int i;
long m=1;
for(i=0;i<n;i++)
m*=d;
return m;
}
bool isRightData(char c,int jz)
{
if((jz<2)||(jz>16))
return false;
char ch[]="00112233445566778899aAbBcCdDeEfF";
int i=0;
for(i=0;i<jz;i++)
{
if(c==ch[i*2])return true;
if(c==ch[i*2+1])return true;
}
return false;
}
long StrToData(char * strData,int jz)
{
int l=strlen(strData);
long IntValue=0;
int bitValue;
int i;
for(i=0;i<l;i++)
{
if(isRightData(strData[i],jz))
{
if(isdigit(strData[i]))
bitValue=strData[i]-0x30;
else
{
switch(strData[i])
{
case 'a':
bitValue=0x0a;
break;
case 'b':
bitValue=0x0b;
break;
case 'c':
bitValue=0x0c;
break;
case 'd':
bitValue=0x0d;
break;
case 'e':
bitValue=0x0e;
break;
case 'f':
bitValue=0x0f;
break;
case 'A':
bitValue=0x0a;
break;
case 'B':
bitValue=0x0b;
break;
case 'C':
bitValue=0x0c;
break;
case 'D':
bitValue=0x0d;
break;
case 'E':
bitValue=0x0e;
break;
case 'F':
bitValue=0x0f;
break;
}
}
IntValue=bitValue*npf(jz,l-i-1)+IntValue;
}
else
return -1;
}
return IntValue;
}
//------------------------------------------------------------------------
void main()
{
FILE *fp = NULL;
FILE *fout;
char ch[MAX_STR_LENGTH]={0};
char tepStr[16] = {0}, tepStr2[8] = {0};
int i = 0, j = 0, iMsgLen = 0, iSrcUnit = 0, iDstUnit = 0;
int numScaleSrc = 16;//待轉換文件的進制,可根據需要指定為2、8、16
int numScaleDst = 2;//轉換后的進制,可為2,8,16
if((fp=fopen("msg.txt","r"))==NULL)
{
printf("can not open file?\n");
exit(0);
}
if((fout=fopen("轉換結果.txt","w"))==NULL)
{
printf("can not open file!\n");
exit(0);
}
ch[0]=fgetc(fp);
switch(numScaleSrc)
{
case 2:
iSrcUnit = 12;
break;
case 8:
iSrcUnit = 4;
break;
case 16:
iSrcUnit = 3;
break;
default:
printf("不支持該進制!");
return;
}
switch(numScaleDst)
{
case 2:
iDstUnit = 12;
break;
case 8:
iDstUnit = 4;
break;
case 16:
iDstUnit = 3;
break;
default:
printf("不支持該進制!");
return;
}
while (ch[0] != EOF)
{
while ( (ch[i] != '\n') && (ch[i] != 'EOF') )
{
i++;
ch[i] = fgetc(fp);
iMsgLen = i;
}
i = 0;
int lData = 0;
char chTemp[13] = "";
int iCount = 0, iRes = 0;
iCount = iMsgLen / iSrcUnit;
iRes = iMsgLen % iSrcUnit;
for (i = 0; i < iCount; i++)
{
for (int k = 0; k < iSrcUnit; k++)
{
chTemp[k] = ch[i*iSrcUnit +k];
}
chTemp[iSrcUnit] = '\0';
lData = StrToData(chTemp, numScaleSrc);
if (lData < 0)
{
printf("\nlData= %X, chTemp=%s,遇到非法字符,暫停\n", lData, chTemp);
getchar();
break;
}
else
{
int y = 0, iStrLen = 0;
switch(numScaleDst)
{
case 2:
if (0 != Byte2ASCIIBinary(lData, tepStr, iDstUnit))
{
printf("Byte2ASCIIBinary() failed\n");
getchar();
}
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
case 8:
sprintf(tepStr, "%o", lData);
iStrLen = strlen(tepStr);
for (y = 0, tepStr2[0] = '\0'; y < (iDstUnit - iStrLen); tepStr2[++y] = '\0')
{
tepStr2[y] = '0';
}
sprintf(tepStr, "%s%o", tepStr2, lData);
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
case 16:
sprintf(tepStr, "%x", lData);
iStrLen = strlen(tepStr);
for (y = 0, tepStr2[0] = '\0'; y < (iDstUnit - iStrLen); tepStr2[++y] = '\0')
{
tepStr2[y] = '0';
}
sprintf(tepStr, "%s%X", tepStr2, lData);
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
default:
printf("\nbad output num scale\n");
}
}
fprintf(fout, "%s", tepStr);
}
if (iRes != 0)
{
for (int k = 0; k < iSrcUnit; k++)
{
if (k < iRes)
{
chTemp[k] = ch[iCount*iSrcUnit +k];
}
else
{
chTemp[k] = '0';
}
}
if (numScaleDst == 2)
chTemp[iRes] = '\0';
else
chTemp[(iCount + 1)*iSrcUnit] = '\0';
lData = StrToData(chTemp, numScaleSrc);
if (lData < 0)
{
printf("\nlData= %X, chTemp=%s,遇到非法字符,暫停\n", lData, chTemp);
getchar();
break;
}
else
{
int y = 0, iStrLen = 0;
switch(numScaleDst)
{
case 2:
if (0 != Byte2ASCIIBinary(lData, tepStr, iRes*(12/iSrcUnit) ) )
{
printf("Byte2ASCIIBinary() failed");
getchar();
}
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
case 8:
sprintf(tepStr, "%o", lData);
iStrLen = strlen(tepStr);
for (y = 0, tepStr2[0] = '\0'; y < (iDstUnit - iStrLen); tepStr2[++y] = '\0')
{
tepStr2[y] = '0';
}
sprintf(tepStr, "%s%o", tepStr2, lData);
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
case 16:
sprintf(tepStr, "%x", lData);
iStrLen = strlen(tepStr);
for (y = 0, tepStr2[0] = '\0'; y < (iDstUnit - iStrLen); tepStr2[++y] = '\0')
{
tepStr2[y] = '0';
}
sprintf(tepStr, "%s%X", tepStr2, lData);
printf("lData= %d, tepStr= %s\n", lData, tepStr);
break;
default:
printf("\nbad output num scale\n");
}
}
fprintf(fout, "%s", tepStr);
}
fprintf(fout, "\n");
for (j = 0; j < MAX_STR_LENGTH; j++)
ch[j] = 0;
j = 0;
i = 0;
ch[0] = fgetc(fp);
}
printf("\n The end\n");
fclose(fp);
fclose(fout);
getchar();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -