0

我创建了一个函数来计算传入十六进制字符串的字节长度,然后将该长度转换为十六进制。它首先将传入字符串的字节长度分配给一个 int,然后我将 int 转换为一个字符串。将传入字符串的字节长度分配给一个 int 后,我​​检查它是否超过 255,如果是,我插入一个零,以便返回 2 个字节,而不是 3 位。

我执行以下操作:

1)输入十六进制字符串并将数字除以 2。

static int ByteLen(std::string sHexStr)
{
    return (sHexStr.length() / 2);
}

2)接收十六进制字符串,然后使用 itoa() 转换为十六进制格式字符串

static std::string ByteLenStr(std::string sHexStr)
{
    //Assign the length to an int 
    int iLen = ByteLen(sHexStr);
    std::string sTemp = "";
    std::string sZero = "0";
    std::string sLen = "";
    char buffer [1000];

     if (iLen > 255)
     {
        //returns the number passed converted to hex base-16 
        //if it is over 255 then it will insert a 0 infront 
                //so to have 2 bytes instead of 3-bits
        sTemp = itoa (iLen,buffer,16);
        sLen = sTemp.insert(0,sZero);               
                return sLen;
     }

     else{
                return itoa (iLen,buffer,16);
     }
}

我将长度转换为十六进制。这似乎工作正常,但是我正在寻找一种更简单的方法来格式化文本,就像我在 C# 中使用 ToString("X2") 方法一样。这是用于 C++ 还是我的方法足够好?

以下是我在 C# 中的操作方式:

public static int ByteLen(string sHexStr)
        {
            return (sHexStr.Length / 2);
        }

        public static string ByteLenStr(string sHexStr)
        {
            int iLen = ByteLen(sHexStr);

            if (iLen > 255)
                return iLen.ToString("X4");
            else
                return iLen.ToString("X2");
        }

我的逻辑在 C++ 中可能有点偏离,但是 C# 方法对于我想做的事情来说已经足够好了。

感谢您的时间。

4

2 回答 2

1
static std::string ByteLenStr(std::string& sHexStr)
{
    int iLen = ByteLen(sHexStr);
    char buffer[16];
    snprintf(buffer, sizeof(buffer), (iLen > 255) ? "%04x" : "%02x", iLen);
    return buffer;
}

snprintf使用格式字符串和变量参数列表格式化缓冲区中的文本。我们正在使用%x格式代码将int参数转换为十六进制字符串。在本例中,我们有两种格式字符串可供选择:

  • 当 时iLen > 255,我们希望数字为四位数。%04x表示格式为十六进制字符串,开头填充零,最多四个位置。
  • 否则,我们希望数字长度为两位数。%02x表示格式为十六进制字符串,最多两个位置补零。

我们使用三元运算符来选择我们使用的格式字符串。最后,iLen作为单个参数传递,该参数将用于提供由函数格式化的值。

于 2013-07-31T21:48:05.937 回答
1

对于不使用任何 C 函数的纯 C++ 解决方案,请尝试使用 astd::stringstream来帮助您进行格式化:

static std::string ByteLenStr(std::string sHexStr)
{
    //Assign the length to an int 
    int iLen = ByteLen(sHexStr);

    //return the number converted to hex base-16 
    //if it is over 255 then insert a 0 in front 
    //so to have 2 bytes instead of 3-bits

    std::stringstream ss;

    ss.fill('0');
    ss.width((iLen > 255) ? 4 : 2);
    ss << std::right << std::hex << iLen;

    return ss.str();
}
于 2013-08-01T00:30:21.200 回答