![用 sed 转换十六进制常量表?](https://linux22.com/image/115671/%E7%94%A8%20sed%20%E8%BD%AC%E6%8D%A2%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E5%B8%B8%E9%87%8F%E8%A1%A8%EF%BC%9F.png)
我有一个 C++ 源文件,其中包含一个大常量表。它们是 S 盒,看起来像这:
const word64 T[8][256] =
{
{
0xa832a829d77f9aa8, 0x4352432297d41143, 0x5f3e5fc2df80615f, 0x061e063014121806,
0x6bda6b7f670cb16b, 0x75bc758f2356c975, 0x6cc16c477519ad6c, 0x592059f2cb927959,
0x71a871af3b4ad971, 0xdf84dfb6f8275bdf, 0x87a1874c35b22687, 0x95fb95dc59cc6e95,
...
}
}
我需要将每个 18 个字符常量包装在 C 宏中,如下所示:
W64LIT(0xa832a829d77f9aa8), W64LIT(0x4352432297d41143), W64LIT(0x5f3e5fc2df80615f), W64LIT(0x061e063014121806)
我知道 sed 是解决方案的一部分,但我在“匹配 16 位十六进制部分”方面遇到了麻烦。
如何在宏中包装每个 64 位十六进制值W64LIT
?
发生巨大变化的原因是 PowerMac 上的旧 Apple 编译器。它产生一个流:
g++ -DNDEBUG -g2 -O3 -fPIC -pipe -c kalyna.cpp
kalyna.cpp:432: error: integer constant is too large for 'long' type
kalyna.cpp:509: error: integer constant is too large for 'long' type
kalyna.cpp:608: error: integer constant is too large for 'long' type
kalyna.cpp:713: error: integer constant is too large for 'long' type
...
但是,我们不能只是添加,ULL
因为早期的 Microsoft 编译器无法处理它。所以宏保持了操作系统之间的和平。
答案1
这对我有用:
sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'
它包含以“0x”为前缀的任何 16 个十六进制数字(仅限小写)序列。