十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)

//注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版得到的字符串须经过Utf8ToAnsi()转码才能跟C#版得到的字符串显示结果一致。

//Delphi版:

function HexToStr(str: string): string;
  function HexToInt(hex: string): integer;
  var
    i: integer;
    function Ncf(num, f: integer): integer;
    var
      i: integer;
    begin
      Result := 1;
      if f = 0 then exit;
      for i := 1 to f do
        result := result * num;
    end;
    function HexCharToInt(HexToken: char): integer;
    begin
      if HexToken > #97 then
        HexToken := Chr(Ord(HexToken) - 32);
      Result := 0;
      if (HexToken > #47) and (HexToken < #58) then { chars 0....9 }
        Result := Ord(HexToken) - 48
      else if (HexToken > #64) and (HexToken < #71) then { chars A....F }
        Result := Ord(HexToken) - 65 + 10;
    end;
  begin
    result := 0;
    hex := ansiuppercase(trim(hex));
    if hex = '' then
      exit;
    for i := 1 to length(hex) do
      result := result + HexCharToInt(hex[i]) * ncf(16, length(hex) - i);
  end;
var
  s, t: string;
  i, j: integer;
  p: pchar;
begin
  s := '';
  i := 1;
  while i < length(str) do begin
    t := str[i] + str[i + 1];
    s := s + chr(hextoint(t));
    i := i + 2;
  end;
  result := s;
end;

 

//********************************************************************

C#版:

 

 ///<summary>
    /// 从16进制转换成汉字
    /// </summary>
    /// <param name="hex"></param>
    /// <param name="charset">编码,如"utf-8","gb2312"</param>
    /// <returns></returns>
    public  string HexToStr(string hex, string charset)
    {
        if (hex == null)
            throw new ArgumentNullException("hex");
        hex = hex.Replace(",", "");
        hex = hex.Replace("\n", "");
        hex = hex.Replace("\\", "");
        hex = hex.Replace(" ", "");
        if (hex.Length % 2 != 0)
        {
            hex += "20";//空格
        }
        // 需要将 hex 转换成 byte 数组。 
        byte[] bytes = new byte[hex.Length / 2];

        for (int i = 0; i < bytes.Length; i++)
        {
            try
            {
                // 每两个字符是一个 byte。 
                bytes[i] = byte.Parse(hex.Substring(i * 2, 2),
                System.Globalization.NumberStyles.HexNumber);
            }
            catch
            {
                // Rethrow an exception with custom message. 
                throw new ArgumentException("hex is not a valid hex number!", "hex");
            }
        }
        System.Text.Encoding chs = System.Text.Encoding.GetEncoding(charset);
        return chs.GetString(bytes);
    }

 

转载于:https://www.cnblogs.com/mumble/p/3757600.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用CEdit类的SetWindowText函数将十六进制格式的字符串显示到edit control上。 具体步骤如下: 1. 在对应的对话框类中定义CEdit类型的变量来操作edit control。 例如: ```c++ class CMyDialog : public CDialogEx { public: CMyDialog(CWnd* pParent = nullptr); // 标准构造函数 virtual ~CMyDialog(); // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_MY_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 afx_msg void OnBnClickedButtonOpen(); afx_msg void OnBnClickedButtonSend(); afx_msg void OnBnClickedButtonClear(); afx_msg LRESULT OnReceiveData(WPARAM wParam, LPARAM lParam); // 串口数据接收消息处理函数 protected: CEdit m_editReceive; // ... }; ``` 在这个例子中,可以看到定义了一个名为m_editReceive的CEdit类型的变量,用于操作接收数据的edit control。 2. 接收串口数据,并化为十六进制格式的字符串。 通常使用异步操作来接收串口数据,可以在Create函数后使用SetCommMask来设置需要的事件,如EV_RXCHAR,表示有数据接收事件。可以在OnReceiveData消息处理函数中将接收到的数据化为十六进制格式的字符串。 这里使用一个名为HexToStr的函数来将十六进制格式的数据化为字符串。 ```c++ LRESULT CMyDialog::OnReceiveData(WPARAM wParam, LPARAM lParam) { DWORD dwRead; BYTE szTemp[4096] = { 0 }; CString strText, strTemp; if (wParam == ID_COM_PORT) //串口事件 { if (lParam & EV_RXCHAR) //有字符接收 { if (ReadFile(m_hComm, szTemp, sizeof(szTemp), &dwRead, nullptr)) { strTemp = HexToStr(szTemp, dwRead); // 将接收到的数据化为十六进制格式的字符串 strText = m_editReceive.GetText(); // 获取edit control的显示内容 strText += strTemp; // 将新接收到的数据添加到显示内容后面 m_editReceive.SetWindowText(strText); // 将新的显示内容设置到edit control中 } } } return 0; } ``` 3. 实现HexToStr函数。 HexToStr函数可以将字节数组化为十六进制格式的字符串。 ```c++ CString HexToStr(BYTE* pData, DWORD dwLength) { CString strResult; for (DWORD i = 0; i < dwLength; i++) { CString strHex; strHex.Format(_T("%02X"), pData[i]); strResult += strHex + _T(" "); // 格式化为十六进制格式的字符串 } return strResult; } ``` 4. 在界面的初始化函数OnInitDialog中设置edit control的显示格式。 可以在OnInitDialog函数中使用SetLimitText设置edit control的最大字符数,使用SetReadOnly设置edit control为只读,防止用户修改。 ```c++ BOOL CMyDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 m_editReceive.SetLimitText(10240); // 设置最大字符数 m_editReceive.SetReadOnly(TRUE); // 设置只读 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值