我创建了一个函数来计算传入的十六进制字符串的字节长度,然后将该长度转换为十六进制。它首先将传入字符串的字节长度分配给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#方法对我来说已经足够了。
感谢您的时间。
答案 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 表示格式为十六进制字符串,开头为零填充,最多四个位置。我们使用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();
}