⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 numscalechange.cpp

📁 对ASCII码构成的字符串作进制转换
💻 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 + -