如何从十六进制数组中增加最高十六进制数?我对十六进制的了解有点不稳定所以任何帮助都会受到赞赏。而且说实话,我不知道这些数字是否是十六进制的,因为它们前面有一个“你”,但如果你删除“你”,它们看起来就是这样。值来自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网页颜色,例如“0xFF0000”(红色),但区别在于它使用2或3个字符而不是6,例如“ufc”或“u112”。
我从服务器收到一个XML文件,它有节点,每个节点都有一个具有唯一值的ID(参见上面的XML示例)。如果我必须创建一个新的“项目”,我需要为它创建一个尚未使用的唯一ID。
答案 0 :(得分:3)
首先,十六进制只是数字的表示。 数字本身保持不变。
添加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属性:
Self属性包含元素的唯一标识符 包含它。此标识符在IDML包中的其他位置使用 引用元素,如“对象引用”中所述 格式“本规范的部分。架构示例2。 自我属性Self {xsd:string}
如您所见,该值是一个字符串,而不是一个数字。
在第31页上,您可以找到Adobe如何为Self创建值的说明,包括此声明:
Self属性值的唯一要求是它 在IDML包中是唯一的。如果您自己编写IDML, 您不需要观察上述模式 - 您可以更改该值 自我属性只要是唯一的就可以得到任何你想要的东西 (在IDML包内)并且只要对元素进行所有引用 也被改为匹配。
答案 1 :(得分:1)
我认为你在思考十六进制时会使事情复杂化;)你可以将十六进制值转换为十进制值,然后继续你正在做的事情,所以你可以这样做:
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);
}
希望可以提供帮助。
答案 2 :(得分:1)
您标记了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 函数/循环中的作用:
然后returns
最大数字加一,再通过.toString(16)
转换回十六进制(并在其前加上'u')。