Как переписать этот .Net C # в ColdFusion? - PullRequest
1 голос
/ 01 февраля 2012

Я понятия не имею, как написать байтовый массив, как это в CF

b = new byte[] { 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b };

Ответы [ 4 ]

4 голосов
/ 01 февраля 2012

Двоичные объекты в ColdFusion являются байтовыми массивами. Вот пример:

<cfset bytes = ToBinary(ToBase64("ABCDEF"))>

<cfloop array="#bytes#" index="byte">
<cfoutput>#byte#</cfoutput><br>
</cfloop>

Это выводит:

65
66
67
68
69
70

редактировать

Я обнаружил что-то неприятное в 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')#">
2 голосов
/ 01 февраля 2012

Они просто выражают большинство значений в шестнадцатеричном формате.Удалить ведущие 0x, которые не используются в CF.Затем объедините все в одну строку и используйте двоичный код для преобразования его в байтовый массив:

<!--- this is equivalent to 0x5e, 0x31, 0x9b, 0xdb, 60, 0x5b --->
<cfset bytes = binaryDecode("5e319bdb3c5b", "hex")>

Редактировать : как указано ниже, код C # переключил синтаксис mid-stream и добавил одинзначение без знака в середине шестнадцатеричного значения:

       0x5e - 94 in hex
       0x31 - 49 in hex
       0x9b - 155 in hex 
       0xdb - 219 in hex 
       60   - ** unsigned byte value
       0x5b - 91 in hex

Однако вам не нужно делать то же самое в коде CF.На самом деле, вероятно, лучше, если вы сделаете , а не , потому что это требует более сложного кода.Используя только hex, вы можете создать байтовый массив в одной строке кода.Плюс это более последовательно и читабельно.Просто используйте formatBaseN для преобразования любых беззнаковых значений, таких как 60, в шестнадцатеричное.

       5e
       31 
       9b
       db
       3c   <= formatBaseN(60, 16)
       5b
2 голосов
/ 01 февраля 2012

Я думаю, вам нужно будет сделать это с помощью Java, если вы хотите настоящий байтовый массив, поскольку ColdFusion не имеет байтовых массивов.

Я бы спросил, для чего вы его используете, поскольку, возможно, есть другое решениеоднако этот пост , вероятно, поможет вам создать массив байтов Java

0 голосов
/ 01 февраля 2012

Вы также можете использовать метод .getBytes() в строках Java.

Например:

<cfscript>
var test = "abc123";
var testBytes = test.getBytes("UTF-8");
</cfscript>

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#getBytes%28%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...