/// <summary>
/// 16진수 문자열을 byte array로 변환
/// </summary>
/// <param name="HexString"></param>
/// <returns></returns>
public byte[] HexStringToByteArray(string HexString)
{
    // 0x, 0X를 제거
    if (HexString.StartsWith("0x") || HexString.StartsWith("0X")) HexString = HexString.Substring(2);

    // hex character가 아닌 문자가 포함되어 있으면 해당 character를 제거
    HexString = new string(HexString.Where(c => Uri.IsHexDigit(c)).ToArray());

    // hex string을 byte array로 변환하기
    string hexString = HexString.Replace(" ", ""); // 공백 제거
    if (hexString.Length % 2 != 0)
    {
        hexString = "0" + hexString; // hex string의 길이가 홀수이면 앞에 0을 추가
        // return null;
    }

    byte[] bytes = new byte[hexString.Length / 2]; // byte array의 크기는 hex string의 길이의 절반
    for (int i = 0; i < hexString.Length; i += 2)
    {
        bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16); // 16진수 문자열을 byte로 변환
    }

    return bytes;
}

/// <summary>
/// 2진수 문자열을 byte array로 변환
/// </summary>
/// <param name="BinaryString"></param>
/// <returns></returns>
public byte[] BinaryStringToByteArray(string BinaryString)
{
    // 0b, 0B를 제거
    if (BinaryString.StartsWith("0b") || BinaryString.StartsWith("0B")) BinaryString = BinaryString.Substring(2);

    // binary character가 아닌 문자가 포함되어 있으면 해당 character를 제거
    BinaryString = new string(BinaryString.Where(c => c == '0' || c == '1').ToArray());

    // binary string을 byte array로 변환하기
    string binaryString = BinaryString.Replace(" ", ""); // 공백 제거
    if (binaryString.Length % 8 != 0)
    {
        //binary string의 길이가 8의 배수가 아니면 8의 배수가되게 0을 추가
        binaryString = binaryString.PadLeft(binaryString.Length + (8 - binaryString.Length % 8), '0');
    }

    byte[] bytes = new byte[binaryString.Length / 8]; // byte array의 크기는 binary string의 길이의 8분의 1
    for (int i = 0; i < binaryString.Length; i += 8)
    {
        bytes[i / 8] = Convert.ToByte(binaryString.Substring(i, 8), 2); // 2진수 문자열을 byte로 변환
    }

    return bytes;
}

/// <summary>
/// 2진수(0b01), Decimal, 16진수(0x01) 문자열을 int형으로 변환
/// </summary>
/// <param name="NumberString"></param>
/// <returns></returns>
public int StringToInt32(string NumberString)
{
    if (NumberString == null) return 0;

    int result = 0;
    if (NumberString.StartsWith("0b") || NumberString.StartsWith("0B"))
    {
        byte[] bytes = BinaryStringToByteArray(NumberString); // 2진수 문자열을 byte array로 변환
        Array.Reverse(bytes); // byte array를 reverse

        if (bytes != null) result = BitConverter.ToInt32(bytes, 0); // byte array를 int로 변환
    }
    else if (NumberString.StartsWith("0x") || NumberString.StartsWith("0X"))
    {
        byte[] bytes = HexStringToByteArray(NumberString); // 16진수 문자열을 byte array로 변환
        Array.Reverse(bytes); // byte array를 reverse

        if (bytes != null) result = BitConverter.ToInt32(bytes, 0); // byte array를 int로 변환
    }
    else
    {
        //숫자를 제외한 문자열 삭제
        NumberString = new string(NumberString.Where(c => char.IsDigit(c) || c == '-').ToArray());

        //하위 10개 문자열만 제외하고 삭제
        if (NumberString.Length > 11) NumberString = NumberString.Substring(NumberString.Length - 11, 11);

        //int형을 벗어나는 값이면 최대값 또는 최소값으로 설정
        Int64 tmpNum = Convert.ToInt64(NumberString);
        if (tmpNum > int.MaxValue) result = int.MaxValue;
        else if (tmpNum < int.MinValue) result = int.MinValue;
        else result = Convert.ToInt32(NumberString);

    }

    return result;
}

'Programming > C#' 카테고리의 다른 글

텍스트 박스에 HEX만 입력 필터링  (0) 2020.12.04
private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
  /* HEX만 입력 되도록 필터링 */
  if (!(char.IsDigit(e.KeyChar) || e.KeyChar == Convert.ToChar(Keys.Back) || 
        "ABCDEF0123456789abcdef".IndexOf(e.KeyChar) != -1)) /* 숫자와 백스페이스를 제외한 나머지를 바로 처리 */
  {
    e.Handled = true;
  }
}
/// <summary>
/// character가 hex characters, spaces, backspace, and delete 이면 true를 반환
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
public bool IsHexDigit(char c)
{
    return Uri.IsHexDigit(c) || c == ' ' || c == '\b' || c == '\u007F' || c == '\u0016' || c == '\u0003';
}

'Programming > C#' 카테고리의 다른 글

Binary, Decimal, Hex 문자열을 숫자로 변환  (0) 2023.08.28

+ Recent posts