如何从十六进制数数组中递增最高的十六进制数?我对十六进制的了解有点参差不齐,所以如果有任何帮助,我们将不胜感激。老实说,我不知道这些数字是否是十六进制的,因为它们前面有一个"u",但如果去掉"u"的话,它们看起来是这样的。这些值来自InDesign代码段文档。
示例:
var anArray = ["uf9","ufc","u111","u112","u136","u137"]; // actual values
var getUniqueID = getNextHigherNumber(anArray);
function getNextHigherNumber(anArray) {
// sort array
// create variable and add one
// return variable
return variable;
}
来自服务器的XML(查看Self和Source):
<Hyperlink Self="ufc" Name="is a multiline hyperlink that terminates here" Source="uf9" Visible="false" Highlight="None" Width="Thin" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="1">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
<Destination type="object">HyperlinkURLDestination/http%3a//test.com#1stMultilineLink/</Destination>
</Properties>
</Hyperlink>
<Hyperlink Self="u112" Name="hyperlink inline" Source="u111" Visible="false" Highlight="None" Width="Thin" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="2">
<Properties>
<BorderColor type="enumeration">Black</BorderColor>
<Destination type="object">HyperlinkURLDestination/http%3a//test.com</Destination>
</Properties>
</Hyperlink>
<Hyperlink Self="u137" Name="another multline hyperlink" Source="u136" Visible="false" Highlight="Outline" Width="Thick" BorderStyle="Solid" Hidden="false" DestinationUniqueKey="3">
<Properties>
<BorderColor type="enumeration">Purple</BorderColor>
<Destination type="object">HyperlinkURLDestination/http%3a//google.com#multilinehyperlink</Destination>
</Properties>
</Hyperlink>
更多背景:
我有一个现有的XML文档,它的ID似乎使用十六进制,我需要能够为新节点创建一个唯一的ID。ID值看起来类似于HTML web颜色,如"0xFF0000"(红色),但不同之处在于它使用了2或3个字符,而不是6个字符,例如"ufc"或"u112"。
我从服务器收到一个XML文件,它有多个节点,每个节点都有一个具有唯一值的ID(请参阅上面的XML示例)。如果我必须创建一个新的"项目",我需要为它创建一个尚未使用的唯一ID。
首先,十六进制只是一个数字的表示。数字本身保持不变。
加2意味着取这个数字的值,再加上2的值。十六进制只是写数字的另一种方式。
我们非常感谢您努力弄清楚这些值是什么,但为什么不检查文档以确定呢?
您有一个与InDesign一起收到的XML。仅仅搜索一下就向我抛出了"IDML",这似乎是Adobe给你试图解析的格式起的名字。
Adobe提供了一份描述这种格式的文档:https://wwwimages2.adobe.com/content/dam/Adobe/en/devnet/indesign/cs55-docs/IDML/idml-specification.pdf
第10.1.1节是关于自我属性:
Self属性包含元素的唯一标识符包含它。此标识符在IDML包的其他地方用于引用元素,如"对象引用"中所述格式"部分。架构示例2。自属性Self{xsd:string}
正如您所看到的,该值是一个字符串,而不是一个数字。
在第31页上,您可以找到Adobe如何为Self创建值的描述,包括以下语句:
Self属性值的唯一要求是在IDML包中是唯一的。如果您自己编写IDML,您不需要遵守上面的模式--您可以更改值"自"属性的值,只要它是唯一的即可(在IDML包中),只要所有对元素的引用也更改为匹配。
我认为在考虑十六进制时会使事情复杂化;)你可以将十六进制值转换为十进制值,然后继续你正在做的事情,所以你可以这样做:
var anArray = ['u112', 'u136', 'uf9', 'u137', 'u111', 'ufc'];
var getUniqueID = getNextHigherNumber(anArray);
trace('u', getUniqueID); // gives : u138
function getNextHigherNumber(anArray:Array):String {
var max:int = 0;
for(var i:int = 0; i<anArray.length; i++){
// convert the hex value to an integer
var num:int = int('0x' + String(anArray[i]).substr(1));
// get the max value
if(num > max) max = num;
}
// return the hex value of (max value + 1)
return (max + 1).toString(16);
}
希望这能有所帮助。
您标记了JavaScript
和ActionScript
(我不知道ActionScript),但您问题中的代码在我看来像JavaScript,而这里的另一个答案在ActionScript中;因此,假设你仍然想这样做(看起来用户null在做什么),我将发布等效的JavaScript:
var anArray = ["uf9","ufc","u111","u112","u136","u137"];
function getNextHigherNumber(theArray) {
var maxNum = 0;
theArray.forEach(function(num) {
num = parseInt(num.substr(1), 16);
if(num > maxNum) maxNum = num;
});
return 'u' + (maxNum + 1).toString(16);
}
// Run the function to see if it works
console.log(getNextHigherNumber(anArray));
它在forEach函数/循环中的作用:
- 从每个数组元素中删除"u"
- 将不带"u"的字符串转换为其int十进制等价值
- 如果当前数字大于以前存储的maxNum,则将该数字存储在maxNum
然后它returns
,最大的数字加一,通过.toString(16)
再次转换回十六进制(并在其前面加一个"u")。