【发布时间】:2009-01-05 12:22:27
【问题描述】:
在this 线程中,有人评论说以下代码只能在“玩具”项目中使用。不幸的是,他没有回来说明为什么它不符合生产质量,所以我希望社区中的某个人能够向我保证代码没问题(因为我非常喜欢它)或找出问题所在。
template< class T1, class T2>
void hexascii( T1& out, const T2& in )
{
out.resize( in.size() * 2 );
const char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
T1::iterator outit = out.begin();
for( T2::const_iterator it = in.begin(); it != in.end(); ++it )
{
*outit++ = hexDigits[*it >> 4];
*outit++ = hexDigits[*it & 0xF];
}
}
template<class T1, class T2>
void asciihex( T1& out, const T2& in )
{
size_t size = in.size;
assert( !(size % 2) );
out.resize( size / 2 );
T1::iterator outit = out.begin();
for( T2::const_iterator it = in.begin(); it != in.end(); it += 2, ++outit )
{
*outit = ((( (*it > '9' ? *it - 0x07 : *it) - 0x30) << 4) & 0x00f0) +
(((*(it+1) > '9' ? *(it+1) - 0x07 : *(it+1)) - 0x30) & 0x000f);
}
}
编辑:感谢你们的帮助,你们已经做了一些很大的改进。我已经根据您的答案以两种建议的样式编写了函数。一些粗略的测试表明,第二种方法比第一种方法略快,但在 IMO 中,第一种方法的可读性有所提高。
template<class T1>
void asciihex2( T1& out, const std::string& in )
{
dassert( sizeof(T1::value_type)==1 );
size_t size = in.size();
assert( !(size % 2) );
out.resize( size / 2 );
T1::iterator outit = out.begin();
for( size_t i = 0; i < in.size(); i += 2 )
{
int tmp;
sscanf( in.c_str() + i, "%02X", &tmp );
*outit++ = tmp;
}
}
template<class T1>
void asciihex3( T1& out, const std::string& in )
{
dassert( sizeof(T1::value_type)==1 );
size_t size = in.size();
assert( !(size % 2) );
out.resize( size / 2 );
T1::iterator outit = out.begin();
const char hexDigits[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F};
for( std::string::const_iterator it = in.begin(); it != in.end(); it += 2, ++outit )
{
*outit = (hexDigits[(*it - 0x30) & 0x1f] << 4) +
hexDigits[((*(it+1) - 0x30) & 0x1f)];
}
}
围绕此代码的一些假设: 1:它们不是通用的,而是用于匿名名称空间来翻译特定类的数据。 2:模板是必需的,因为正在使用两种不同的容器类型(一种是 std::vector,另一种是来自第三方库的类似字节数组类型容器。 3:目的是能够将不确定长度的二进制数据转换为字符串并再次转换回来(0x1234abcd “1234abcd”) 4:断言在调试和发布模式下都会捕获错误 5:当这些函数被调用时,字符串的大小已经被检查过了,如果出现严重错误,断言用于终止处理 6:需要一些评论
任何其他想法表示赞赏。
【问题讨论】:
-
Patrick 你的问题没什么可反驳的,但是标题很模糊,不幸的是我想不出更准确和有意义的东西,但如果有人有一个好主意,那就太好了,毕竟问题可能意味着任何事情。
-
asciihex的第一行不应该是:size_t size = in.size();
-
罗伯特这个问题我也有同样的想法,但也想不出什么简洁有意义的东西。
-
也许 HexToBinary 和 BinaryToHex 是更有意义的名称,这里的术语 ASCII 具有误导性,特别是因为模板的使用表明可能是 unicode。否则十六进制为 ASCII。
-
请尝试为您的问题指定一个标题,现在就是您的答案。没有人能够准确地搜索到这个