EBCDIC字符集转码


1:windows 平台下:

1.1 ebcdic编码转ascII编码例子(试过,码表不完全正确)

char e2a[256] =
{undefined
0, 1, 2, 3,(char)156, 9,(char)134,127,(char)151,(char)141,(char)142, 11, 12, 13, 14, 15,
16, 17, 18, 19,(char)157,(char)133, 8,(char)135, 24, 25,(char)146,(char)143, 28, 29, 30, 31,
(char)128,(char)129,(char)130,(char)131,(char)132, 10, 23, 27,(char)136,(char)137,(char)138,(char)139,(char)140, 5, 6, 7,
(char)144,(char)145, 22,(char)147,(char)148,(char)149,(char)150, 4,(char)152,(char)153,(char)154,(char)155, 20, 21,(char)158, 26,
32,(char)160,(char)161,(char)162,(char)163,(char)164,(char)165,(char)166,(char)167,(char)168, 91, 46, 60, 40, 43, 33,
38,(char)169,(char)170,(char)171,(char)172,(char)173,(char)174,(char)175,(char)176,(char)177, (char)93, 36, 42, 41, 59, 94,
45, 47,(char)178,(char)179,(char)180,(char)181,(char)182,(char)183,(char)184,(char)185,(char)124, 44, 37, 95, 62, 63,
(char)186,(char)187,(char)188,(char)189,(char)190,(char)191,(char)192,(char)193,(char)194, 96, 58, 35, 64, 39, 61, 34,
(char)195, 97, 98, 99,(char)100,(char)101,(char)102,(char)103,(char)104,(char)105,(char)196,(char)197,(char)198,(char)199,(char)200,(char)201,
(char)202,(char)106,107,108,109,110,111,112,113,114,(char)203,(char)204,(char)205,(char)206,(char)207,(char)208,
(char)209,(char)126,115,116,117,118,119,(char)120,(char)121,(char)122,(char)210,(char)211,(char)212,(char)213,(char)214,(char)215,
(char)216,(char)217,(char)218,(char)219,(char)220,(char)221,(char)222,(char)223,(char)224,(char)225,(char)226,(char)227,(char)228,
(char)229,(char)230,(char)231,
(char)123, 65, 66, 67, 68, 69, 70, 71, 72, 73,(char)232,(char)233,(char)234,(char)235,(char)236,(char)237,
(char)125, 74, 75, 76, 77, 78, 79, 80, 81, 82,(char)238,(char)239,(char)240,(char)241,(char)242,(char)243,
92,(char)159, 83, 84, 85, 86, 87, 88, 89, 90,(char)244,(char)245,(char)246,(char)247,(char)248,(char)249,
48, 49, 50, 51, 52, 53, 54, 55, 56, 57,(char)250,(char)251,(char)252,(char)253,(char)254,(char)255
};

char ebcdic[3000];

char asc[3000];

for( int i = 0; i < 3000; i ++ )

{undefined

asc[i] = e2a[ (unsigned char)ebcdic[i] ];
}

    asc数组中存放的数据的编码格式即为ascII编码。


1.2 ascII编码转ebcdic编码 (与ebcdic编码转ascII编码类似,只是使用的数组不同)

char a2e[256] =
{undefined
(char)0, (char)1, (char)2, (char)3, (char)55, (char)45, (char)46, (char)47, (char)22, (char)5, (char)37, (char)11, (char)12, (char)13, (char)14, (char)15,
(char)16, (char)17, (char)18, (char)19, (char)60, (char)61, (char)50, (char)38, (char)24, (char)25, (char)63, (char)39, (char)28, (char)29, (char)30, (char)31,
(char)64, (char)79, (char)127,(char)123,(char)91, (char)108,(char)80, (char)125, (char)77, (char)93, (char)92, (char)78,(char)107, (char)96, (char)75,(char)97,
(char)240,(char)241,(char)242,(char)243,(char)244,(char)245,(char)246,(char)247,(char)248,(char)249,(char)122, (char)94, (char)76,(char)126,(char)110,(char)111,
(char)124,(char)193,(char)194,(char)195,(char)196,(char)197,(char)198,(char)199,(char)200,(char)201,(char)209,(char)210,(char)211,(char)212,(char)213,(char)214,
(char)215,(char)216,(char)217,(char)226,(char)227,(char)228,(char)229,(char)230,(char)231,(char)232,(char)233, (char)74,(char)224, (char)90, (char)95,(char)109,
(char)121,(char)129,(char)130,(char)131,(char)132,(char)133,(char)134,(char)135,(char)136,(char)137,(char)145,(char)146,(char)147,(char)148,(char)149,(char)150,
(char)151,(char)152,(char)153,(char)162,(char)163,(char)164,(char)165,(char)166,(char)167,(char)168,(char)169,(char)192,(char)106,(char)208,(char)161, (char)7,
(char)32, (char)33, (char)34, (char)35, (char)36, (char)21, (char)6, (char)23, (char)40, (char)41, (char)42, (char)43, (char)44, (char)9, (char)10,(char) 27,
(char)48, (char)49, (char)26, (char)51, (char)52, (char)53,(char) 54, (char)8, (char)56, (char)57, (char)58, (char)59, (char)4, (char)20, (char)62,(char)225,
(char)65, (char)66, (char)67, (char)68, (char)69, (char)70, (char)71, (char)72, (char)73, (char)81, (char)82, (char)83, (char)84, (char)85, (char)86,(char) 87,
(char)88, (char)89, (char)98, (char)99,(char)100,(char)101,(char)102,(char)103,(char)104,(char)105,(char)112,(char)113,(char)114,(char)115,(char)116,(char)117,
(char)118, (char)119,(char)120,(char)128,(char)138,(char)139,(char)140,(char)141,(char)142,(char)143,(char)144,(char)154,(char)155,(char)156,(char)157,(char)158,
(char)159,(char)160,(char)170,(char)171,(char)172,(char)173,(char)174,(char)175,(char)176,(char)177,(char)178,(char)179,(char)180,(char)181,(char)182,(char)183,
(char)184,(char)185,(char)186,(char)187,(char)188,(char)189,(char)190,(char)191,(char)202,(char)203,(char)204,(char)205,(char)206,(char)207,(char)218,(char)219,
(char)220,(char)221,(char)222,(char)223,(char)234,(char)235,(char)236,(char)237,(char)238,(char)239,(char)250,(char)251,(char)252,(char)253,(char)254,(char)255
};

char ebcdic[3000];

char asc[3000];

for( int i = 0; i < 3000; i ++ )

{undefined

ebcdic[i] = e2a[ (unsigned char)asc[i] ] ;
}

2.linux平台下,使用iconv系统库函数进行转码。

/*
 * 20211123-zf
 * gcc  -o  test_iconv test_iconv.c -g
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "iconv.h"


int EbcdicToAscii(char  *sIn,  char  *sOut)  
{
	iconv_t  cd;
	int		ret = 0;
	size_t  inBytesLeft  =  0;  
	size_t  outBytesLeft  =  0;  
	char  *inTemp  =  sIn;  
	char *outTemp  =  sOut;  
	char  localCode[20],  targetCode[20];
	int i = 0; 
	char*	in_temp_again = NULL;
	char*	in_temp_again2 = NULL;
	size_t  in_temp_again2_len  =  0;  

	inBytesLeft=strlen(sIn);
	outBytesLeft=strlen(sIn)  *  2;
	 
	memset(&localCode, 0x00,  sizeof(localCode));  
	sprintf(localCode, "%s",  "GBK");/*850  ASCII -- IBM-850 */  

	memset(&targetCode, 0x00,  sizeof(targetCode));  
	sprintf(targetCode, "%s",  "IBM-1388");  /*  037  for  EBCDIC  -- IBM-370 */  

	cd=iconv_open(localCode,  targetCode); 
	if(cd == (iconv_t)-1)
	{
		printf("open iconv error.\n");
		return -1;
	} 
	
	printf("cd:%d, &inTemp:%s,  &inBytesLeft:%d,  &outTemp:%s,  &outBytesLeft:%d\n", cd, inTemp,  inBytesLeft,  outTemp,  outBytesLeft);
	printf("in_conv: %d-%c \n", inBytesLeft, *inTemp);
	for(i = 0; i < inBytesLeft; i++)
	{
		printf("%02x-", inTemp[i]);
	}
	printf("\n");
	
	
	ret = iconv(cd, &inTemp,  &inBytesLeft,  &outTemp,  &outBytesLeft); 
	if(ret != 0)  
	{
		in_temp_again_len = inBytesLeft + 2;
		in_temp_again = malloc(in_temp_again_len);
		in_temp_again2 = in_temp_again;
		if(ret = iconv(cd, &in_temp_again2,  &in_temp_again_len,  &outTemp,  &outBytesLeft))
		{
			if (in_temp_again)
			{
				free(in_temp_again);
			}
			return  -1;    
		}
		if (in_temp_again)
		{
			os_free(in_temp_again);
		}


	  printf("Error  calling  iconv_Close\n");  
	  return  1;
    }  
  
    if  (iconv_close(cd)  ==  -1) 
    {  
        printf("Error  calling  iconv_Close\n");  
        return  1;  
    }  
  
    return  0;  
  }
  


void hex2bin(
	char*	src,
	unsigned char*	dst,
	int		src_len
)
{
	int				i;
	unsigned  char	high;
	unsigned char	low;
	
	for(i=0; i < src_len; i +=2)
	{
		high = toupper(src[i]);
		low = toupper(src[i+1]);
		
		if(high > 0x39)
			high -= 0x37;
		else
			high -= 0x30;
		
		if(low > 0x39)
			low -= 0x37;
		else
			low -= 0x30;
		
		dst[i/2] = high << 4 | low;	
	}
	
}
  
void
main()
{
	int		i = 0;
	char*	src = "810E5BCF4D9B0FF84040"; 
	//ffffffe1-0e-5b-ffffffcf-4d-ffffff9b-0f-fffffff8-60-60-
	//ffffff81-0e-5b-ffffffcf-4d-ffffff9b-0f-fffffff8-40-40-
  
	//char*	src = "61d6d0b9fa38";
	//char*	src = "614e2d56fd38";
	//char	src_bin[1024] = {0x81, 0x0e, 0x5b, 0xcf, 0x4d, 0x9b, 0x0f, 0xf8, 0x40, 0x40};
	char	src_bin[1024] = "";
	char    dst[1024] = "";
	
	
	printf("src:%d\n", strlen(src));
	for(i = 0; i < strlen(src); i++)
	{
		printf("%02x-", src[i]);
	}
	printf("\n");
	
	hex2bin(src, src_bin, strlen(src));
	
	printf("src_bin: %d-%c \n", strlen(src_bin), *src_bin);
	for(i = 0; i < strlen(src_bin); i++)
	{
		printf("%02x-", src_bin[i]);
	}
	printf("\n");
	
	
	if( EbcdicToAscii(src_bin, dst) != 0 )
	{
		printf("iconv faild!\n");
		return ;
	}
	
	printf("dst:\n");
	for(i = 0; i < strlen(dst); i++)
	{
		printf("%02x-", dst[i]);
	}
	
	printf("\n");
	

	
	
}