Java 8实现GUID与Oracle RAW(16)字符串双向转换方法问询
Java 8 实现GUID与Oracle RAW(16)字符串互转
转换原理
GUID和Oracle RAW(16)的差异仅在于前三个分段的字节序:标准GUID的前三个分段采用小端字节序存储,转换为Oracle RAW格式时需要将每个分段的字节(每2个十六进制字符为1个字节)倒序排列,后两个分段保持大端字节序无需调整,最终拼接所有分段转为大写即可。
相关格式说明
- 标准格式:
A0824186-1E9C-AE47-95E1-1431542C2133 - 带括号格式:
{A0824186-1E9C-AE47-95E1-1431542C2133} - Oracle RAW(16)格式:
864182A09C1E47AE95E11431542C2133 - Oracle hextoraw用法:
HEXTORAW('864182A09C1E47AE95E11431542C2133') - SQL Server使用Oracle字节序格式:
0x864182A09C1E47AE95E11431542C2133
完整实现代码
public class GuidRawConverter { // 辅助方法:反转十六进制分段的字节顺序 private static String reverseHexSegment(String segment) { StringBuilder sb = new StringBuilder(); for (int i = segment.length() - 2; i >= 0; i -= 2) { sb.append(segment, i, i + 2); } return sb.toString(); } /** * 标准GUID转换为Oracle RAW(16)字符串 * @param guid 支持带横杠、带括号的任意大小写GUID格式 * @return 大写的32位RAW格式字符串 */ public static String guidToOracleRaw(String guid) { // 清理输入,去除所有非十六进制字符 String cleanGuid = guid.replaceAll("[^0-9a-fA-F]", "").toUpperCase(); if (cleanGuid.length() != 32) { throw new IllegalArgumentException("无效的GUID格式,长度需为32位十六进制字符"); } // 拆分GUID的五个分段 String seg1 = cleanGuid.substring(0, 8); String seg2 = cleanGuid.substring(8, 12); String seg3 = cleanGuid.substring(12, 16); String seg4 = cleanGuid.substring(16, 20); String seg5 = cleanGuid.substring(20); // 反转前三个分段的字节顺序 seg1 = reverseHexSegment(seg1); seg2 = reverseHexSegment(seg2); seg3 = reverseHexSegment(seg3); // 拼接得到RAW格式 return seg1 + seg2 + seg3 + seg4 + seg5; } /** * Oracle RAW(16)字符串转换为标准GUID * @param raw 支持带0x前缀的任意大小写RAW格式 * @return 小写的标准横杠分隔GUID */ public static String oracleRawToGuid(String raw) { // 清理输入,去除所有非十六进制字符 String cleanRaw = raw.replaceAll("[^0-9a-fA-F]", "").toUpperCase(); if (cleanRaw.length() != 32) { throw new IllegalArgumentException("无效的RAW(16)格式,长度需为32位十六进制字符"); } // 拆分RAW的五个分段,反转前三个分段恢复原字节序 String seg1 = reverseHexSegment(cleanRaw.substring(0, 8)); String seg2 = reverseHexSegment(cleanRaw.substring(8, 12)); String seg3 = reverseHexSegment(cleanRaw.substring(12, 16)); String seg4 = cleanRaw.substring(16, 20); String seg5 = cleanRaw.substring(20); // 拼接为标准GUID格式 return String.join("-", seg1, seg2, seg3, seg4, seg5).toLowerCase(); } // 测试示例 public static void main(String[] args) { String standardGuid = "A0824186-1E9C-AE47-95E1-1431542C2133"; // 正向转换 String rawStr = guidToOracleRaw(standardGuid); System.out.println("GUID转RAW结果:" + rawStr); // 反向转换 String revertGuid = oracleRawToGuid(rawStr); System.out.println("RAW转GUID结果:" + revertGuid); } }
输出结果
GUID转RAW结果:864182A09C1E47AE95E11431542C2133 RAW转GUID结果:a0824186-1e9c-ae47-95e1-1431542c2133
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

