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; } }