C#

HexStrToBin_class HEX문자열 데이터를 미리 변환하여 실행속도 향상

안녕1999 2020. 10. 17. 23:36
c#은 아주 느리다.
실행시간에 HEX문자열을 BIN으로 변환하는 과정은 아주 아주 아주 느리다.
그래서, 처음에 한번 변환하고, 전송시에는 변환된 BIN데이터만 전송한다.
ex)
		HexStrToBin_class data1 = new HexStrToBin_class("22 00 02 00 04"),
			data2 = new HexStrToBin_class("80 20 00 04 00 00"),
			data3= new HexStrToBin_class("30 80 20 00 00 00 CD");
		void some_func()
		{
			WRITE232("data1", data1.buf, data1.len);
			WRITE232("data2", data2.buf, data2.len);
			WRITE232("data3", data3.buf, data3.len);
		}




public class HexStrToBin_class
{
	public string HexStr;
	public byte[] buf;
	public int len;
	public HexStrToBin_class(string hex_str)
	{
		byte[] a=new byte[1024*8];
		HexStr = hex_str;
		len =G.HEX_str_to_Bin(hex_str, ref a);
		buf = G.Memdup(ref a, len);
	}
}

static public class G
{
	static public void Memcpy(ref byte[] dst,ref byte[] src,int len)
	{
		Buffer.BlockCopy(src, 0, dst, 0, len);
	}
	static public byte[] Memdup(ref byte[] data, int len)
	{
		byte[] ret = new byte[len];
		G.Memcpy(ref ret, ref data, len);
		return ret;
	}
    static public byte Hex2Binary(char a)
	{
		byte ret = 0;
		if (('0'<=a)&& (a<='9'))
		{
			ret = (byte)(a - '0');
		}
		else if(('A'<=a)&&(a<='Z'))
		{
			ret = (byte)(a - 'A'+10);
		}
		else if (('a' <= a) && (a <= 'z'))
		{
			ret = (byte)(a - 'a' + 10);
		}
		else
		{
			//err
		}
		return ret;
	}
    static public int HEX_str_to_Bin(string s, ref byte[] buf)//3자리이상의 홀수 자릿수의 연속하는 HEX문자열이 없어야한다.
	{
		int len = 0;
		int i, n, cnt = 0;
		char a;
		byte c = 0;

		i = 0;
		n = s.Length;
		while (i < n)
		{
			a = s[i];
			if (a == ';')
			{
				//주석문
				break;
			}
			else if ((a == ' ') || (a == '\t') || (a == '\r') || (a == '\n'))
			{
				//skip
				//reset
				cnt = 0;
				c = 0;
			}
			else
			{
				//1byte HEX문자(최대 2문자)를 바이너리로 변환
				c = (byte)((c << 4) | Hex2Binary(a));
				cnt++;
				if (cnt >= 2)
				{
					buf[len] = c;
					len++;
					//reset
					cnt = 0;
					c = 0;
				}
				else
				{

				}
			}
			i++;
		}
		if (cnt > 0)
		{
			buf[len] = c;
			len++;
		}
		else
		{
		}
		return len;
	}
}