如何在ColdFusion中重写这个.NETC#?
我不知道如何在CF中编写这样的byteArray如何在ColdFusion中重写这个.NETC#?,c#,.net,coldfusion,C#,.net,Coldfusion,我不知道如何在CF中编写这样的byteArray b = new byte[] { 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b }; 我认为,如果您想要一个真正的字节数组,就需要使用Java来实现这一点,因为ColdFusion没有字节数组 我想问您使用它的目的是什么,因为可能还有另一种解决方案,但是,它可能会帮助您创建Java字节数组我认为,如果您想要一个真正的字节数组,您需要使用Java,因为ColdFusion没有字节数组 我想问您使用它的目的是什么,因为可能还有另
b = new byte[] { 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b };
我认为,如果您想要一个真正的字节数组,就需要使用Java来实现这一点,因为ColdFusion没有字节数组
我想问您使用它的目的是什么,因为可能还有另一种解决方案,但是,它可能会帮助您创建Java字节数组我认为,如果您想要一个真正的字节数组,您需要使用Java,因为ColdFusion没有字节数组
我想问您使用它的目的是什么,因为可能还有另一种解决方案,但是,它可能会帮助您创建Java字节数组,ColdFusion中的二进制对象是字节数组。以下是一个例子:
<cfset bytes = ToBinary(ToBase64("ABCDEF"))>
<cfloop array="#bytes#" index="byte">
<cfoutput>#byte#</cfoutput><br>
</cfloop>
编辑
在回答这个问题时,我发现ColdFusion有些不愉快。。。也就是说,CF显然将所有数字都视为有符号的,因此拒绝将大于127的值强制转换为字节字段。为了获得大于127的值(例如,在您的示例中为0x9b/155),必须将其强制转换为无符号。不幸的是,这并不是那么容易做到的。不过,我已经启动了一个小功能,使其更容易:
<cffunction name="uint">
<cfargument name="val">
<cfargument name="radix" default="16">
<cfreturn CreateObject('java', 'org.apache.axis.types.UnsignedInt').init(InputBaseN(arguments.val, arguments.radix)).byteValue()>
</cffunction>
<cfset bin = JavaCast("byte[]",
[
uint('5e'),
uint('31'),
uint('9b'),
uint('db'),
uint('db'),
uint('60', 10),
uint('5b')
])>
<cfdump var="#ToBase64(bin, 'utf-16')#">
ColdFusion中的二进制对象是字节数组。以下是一个例子:
<cfset bytes = ToBinary(ToBase64("ABCDEF"))>
<cfloop array="#bytes#" index="byte">
<cfoutput>#byte#</cfoutput><br>
</cfloop>
编辑
在回答这个问题时,我发现ColdFusion有些不愉快。。。也就是说,CF显然将所有数字都视为有符号的,因此拒绝将大于127的值强制转换为字节字段。为了获得大于127的值(例如,在您的示例中为0x9b/155),必须将其强制转换为无符号。不幸的是,这并不是那么容易做到的。不过,我已经启动了一个小功能,使其更容易:
<cffunction name="uint">
<cfargument name="val">
<cfargument name="radix" default="16">
<cfreturn CreateObject('java', 'org.apache.axis.types.UnsignedInt').init(InputBaseN(arguments.val, arguments.radix)).byteValue()>
</cffunction>
<cfset bin = JavaCast("byte[]",
[
uint('5e'),
uint('31'),
uint('9b'),
uint('db'),
uint('db'),
uint('60', 10),
uint('5b')
])>
<cfdump var="#ToBase64(bin, 'utf-16')#">
它们只是用十六进制表示大多数值。删除CF中未使用的前导
0x
。然后将所有内容连接成单个字符串,并使用binaryDecode将其转换为字节数组:
<!--- this is equivalent to 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b --->
<cfset bytes = binaryDecode("5e319bdb3c5b", "hex")>
但是,您不必在CF代码中执行相同的操作。事实上,如果不这样做可能会更好,因为它需要更复杂的代码。通过仅使用十六进制,您可以在一行代码中创建字节数组。此外,它更加一致和可读。只需使用将任何无符号值(如60
)转换为十六进制即可
5e
31
9b
db
3c <= formatBaseN(60, 16)
5b
5e
31
9b
分贝
3c它们只是用十六进制表示大多数值。删除CF中未使用的前导0x
。然后将所有内容连接成单个字符串,并使用binaryDecode将其转换为字节数组:
<!--- this is equivalent to 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b --->
<cfset bytes = binaryDecode("5e319bdb3c5b", "hex")>
但是,您不必在CF代码中执行相同的操作。事实上,如果不这样做可能会更好,因为它需要更复杂的代码。通过仅使用十六进制,您可以在一行代码中创建字节数组。此外,它更加一致和可读。只需使用将任何无符号值(如60
)转换为十六进制即可
5e
31
9b
db
3c <= formatBaseN(60, 16)
5b
5e
31
9b
分贝
3c您还可以对java字符串使用.getBytes()
方法
例如:
<cfscript>
var test = "abc123";
var testBytes = test.getBytes("UTF-8");
</cfscript>
var test=“abc123”;
var testBytes=test.getBytes(“UTF-8”);
您还可以对java字符串使用.getBytes()
方法
例如:
<cfscript>
var test = "abc123";
var testBytes = test.getBytes("UTF-8");
</cfscript>
var test=“abc123”;
var testBytes=test.getBytes(“UTF-8”);
我不是CF方面的专家,但会不会是这样:@dotNetZombie遗憾地说,CF不承认0x5e(以及类似的值)是有效的原始值。我不是CF方面的专家,但会不会是这样:@dotNetZombie遗憾地说,CF不承认0x5e(以及类似的值)作为有效的原语值。coldfusion中的二进制对象是字节数组。您是否否决了我的答案,然后提出了一个使用Java的解决方案:)所有coldfusion最终都使用Java。我只是因为这句话而投了反对票:“ColdFusion没有字节数组”。这完全是不真实的。而且-我的java版本只有在绝对需要以十六进制值开始时才需要。否则,我的答案的第一部分(没有提到java类/铸造)就可以了没有什么反对Jake的建议,但它可以在一个函数调用中完成,甚至可以使用十六进制。我怀疑他们是否需要完全复制C代码,只需同意一种编码(十六进制或base64)就可以得到相同的结果。coldfusion中的二进制对象是字节数组。你是否否决了我的答案,然后提出了一种使用Java的解决方案:)所有coldfusion最终都使用Java。我只是因为这句话而投了反对票:“ColdFusion没有字节数组”。这完全是不真实的。而且-我的java版本只有在绝对需要以十六进制值开始时才需要。否则,我的答案的第一部分(没有提到java类/铸造)就可以了没有什么反对Jake的建议,但它可以在一个函数调用中完成,甚至可以使用十六进制。我怀疑他们是否需要完全复制C代码,只需同意一种编码(十六进制或base64)并获得相同的结果。请参阅更新版本,该版本实际上适用于您提供的值。尽管后者有效,但只对十六进制字符串进行二进制解码要简单得多。请参阅更新版本,它实际上与您提供的值一起工作。虽然后者可以工作,但只对十六进制字符串进行二进制解码要简单得多。是的,但在这种情况下,获取文本字符串的字节不会产生相同的值。您有没有失败的示例?任何十六进制(或base64)字符串,如5e319bdb3c5b
。仅仅使用getBytes(“utf-8”)无法正确解码它们。它返回单个字符的二进制,而不是十六进制对。因此,在本例中,当应该有6个字节时,您将得到12个字节。换句话说,输入是hex
,而不是UTF-8
。因此需要将其解码为十六进制才能得到正确答案。使用getBytes(“UTF-8”)
不会导致错误,但也不会返回正确的字节。True,但在这种情况下,获取文本字符串的字节将