我有一个返回objectGUID的CFLDAP查询。如何在ColdFusion中将其转换为8-4-4-4-12模式中的有效UUID字符串?
我已指定returnAsBinary="ObjectGUID"
,但toString(getLDAP.ObjectGUID)
未返回所需的结果。
更新
我尝试了binaryEncode():
<cfset guid = binaryencode(getLDAP.objectguid,"HEX")>
返回:
18E0CE3388B79C4EA4D73894AE8CD8F6
但是我期待这个(由另一个我无法看到转换步骤的进程提取和提供)。
3cee018-b788-4e9c-a4d7-3894ae8cd8f6
嗯......虽然他们不匹配,但后半部分是一样的。 a4d7-3894ae8cd8f6
。
答案 0 :(得分:2)
哼哼......下半场是一样的
有趣。来自this thread的链接解释了原因。显然,它是more involved than just converting the binary into hex, in one shot:
- 首先,要知道形成虚线字符串的字节索引的顺序:
[3] [2] [1] [0] - [5] [4] - [7] [6] - [8] [9] - [10] [11] [12] [13] [14] [15]
- 接下来,将位屏蔽应用于数组中访问的每个单字节值。
- 然后转换为值的十六进制表示。
- 只需确保十六进制值是一个两位数值,而不是“A”,它应该是“0A”
醇>
由于CF的数组是基于1的,所以只需在位置上加+1。这将以正确的顺序构建解码后的字符串(没有破折号,您可以使用字符串函数轻松添加)。
// Get GUID binary
bin = yourQuery.objectGUID[rowNumber];
// Extract bytes in this sequence
order = [4,3,2,1, 6,5, 8,7, 9,10,11,12,13,14,15,16];
// Stores converted bytes
hex = [];
for (pos in order) {
// Apply mask to current byte and convert to hext
arrayAppend(hex, formatBaseN(BitAnd(bin[pos], 255), 16));
}
writeOutput("Hex string = "& arrayToList(hex, ""));
答案 1 :(得分:1)
是的......我在一篇旧的CF帖子中找到了它,它对我有用:
<CFLDAP ACTION="query" NAME="getLDAP" START="DC=info,DC=sys" SCOPE="subtree" STARTROW="1" maxRows="1"
SERVER="#domainCONTROLLER#" USERNAME="#USERNAME#" PASSWORD="#PASSWORD#" PORT="389" TIMEOUT="60"
ATTRIBUTES="sAMAccountName,mail,name,givenName,middleName,sn,title,department,ObjectGUID"
FILTER="sAMAccountName=#session.username#"
returnAsBinary = "ObjectGUID">
<cfset hexguid = BinaryEncode(getLDAP.objectguid,"Hex")>
<cfset sthex = toString(hexguid)>
<cfset GuidStr = mid(sthex,7,2)>
<cfset GuidStr = GuidStr & mid(sthex,5,2)>
<cfset GuidStr = GuidStr & mid(sthex,3,2)>
<cfset GuidStr = GuidStr & mid(sthex,1,2)>
<cfset GuidStr = GuidStr & mid(sthex,11,2)>
<cfset GuidStr = GuidStr & mid(sthex,9,2)>
<cfset GuidStr = GuidStr & mid(sthex,15,2)>
<cfset GuidStr = GuidStr & mid(sthex,13,2)>
<cfset GuidStr = GuidStr & mid(sthex,17,18)>
<cfset guid = left(GuidStr,8) & "-" & mid(GuidStr,9,4) & "-" & mid(GuidStr,13,4) & "-" & mid(GuidStr,17,4) & "-" & mid(GuidStr,21,18)>
你的雄辩更有说服力。谢谢!
答案 2 :(得分:1)
这是我为Pentaho Kettle的“ Modified Javascript”步骤所做的JavaScript实现。
它以字节[16]数组的形式从Java接收if (!Array.isArray) {
Array.isArray = function(arg) {
return arg.constructor === Array;
};
}
,并继续使用Java类进行处理。
objectGUID
这不是Coldfusion方言,是的,但希望对扫描网络以解决类似任务的人有用。