如何在ColdFusion中重写这个.NETC#?

如何在ColdFusion中重写这个.NETC#?,c#,.net,coldfusion,C#,.net,Coldfusion,我不知道如何在CF中编写这样的byteArray b = new byte[] { 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b }; 我认为,如果您想要一个真正的字节数组,就需要使用Java来实现这一点,因为ColdFusion没有字节数组 我想问您使用它的目的是什么,因为可能还有另一种解决方案,但是,它可能会帮助您创建Java字节数组我认为,如果您想要一个真正的字节数组,您需要使用Java,因为ColdFusion没有字节数组 我想问您使用它的目的是什么,因为可能还有另

我不知道如何在CF中编写这样的byteArray

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,但在这种情况下,获取文本字符串的字节将