获取十六进制字符串的字节长度的替代方法

时间:2013-07-31 21:13:27

标签: c++ visual-studio-2010 visual-c++ unmanaged

我创建了一个函数来计算传入的十六进制字符串的字节长度,然后将该长度转换为十六进制。它首先将传入字符串的字节长度分配给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#方法对我来说已经足够了。

感谢您的时间。

2 个答案:

答案 0 :(得分: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 表示格式为十六进制字符串,零填充最多两个位置。

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

答案 1 :(得分:1)

对于不使用任何C函数的纯C ++ solutuon,请尝试使用std::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();
}