How CBOR Parse Task in Standard mode works? - chainlink
I wonder how cborparse in mode="standard" works cause I can't make it work.
Resources
Chainlink CBOR Parse Task - docs
Chainlink CBOR Prase Task - implementation
Chainlink CBOR Parse Task - implementation tests
Online CBOR encoder
Online uft8 to bytes converter
Environment
Chainlink Node v1.7.0, and v1.8.1.
Case OK: cborparse in mode="diet" (default)
Test Case
Input
{"path":["recent","usd"],"url":"https://etherprice.com/api"}
Input CBOR encoded
A264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069
Webhook TOML spec
type = "webhook"
schemaVersion = 1
name = "Test decode CBOR diet"
observationSource = """
merge [type="merge" left=<{"input": "0x"}> right=<{"input": "0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"}>]
decode_cbor [type="cborparse" data="$(merge.input)"]
merge -> decode_cbor
"""
JSON job run
{
"__typename": "JobRun",
"id": "240",
"allErrors": [
],
"createdAt": "2022-10-14T12:06:56.646544Z",
"fatalErrors": [
],
"finishedAt": "2022-10-14T12:06:56.64718Z",
"job": {
"__typename": "Job",
"id": "225",
"name": "Test decode CBOR diet",
"observationSource": " merge [type="merge" left=<{"input": "0x"}> right=<{"input": "0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"}>] decode_cbor [type="cborparse" data="$(merge.input)"] "
},
"status": "COMPLETED",
"inputs": {
"decode_cbor": {
"path": [
"recent",
"usd"
],
"url": "https://etherprice.com/api"
},
"jobRun": {
"meta": null
},
"merge": {
"input": "0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"
}
},
"outputs": [
"{"path":["recent","usd"],"url":"https://etherprice.com/api"}"
],
"taskRuns": [
]
}
Case KO: cborparse in mode="standard"
Test Case
Input
{"path":["recent","usd"],"url":"https://etherprice.com/api"}
Input CBOR encoded
A264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069
Input CBOR encoded as array of bytes
[41, 32, 36, 34, 37, 30, 36, 31, 37, 34, 36, 38, 38, 32, 36, 36, 37, 32, 36, 35, 36, 33, 36, 35, 36, 45, 37, 34, 36, 33, 37, 35, 37, 33, 36, 34, 36, 33, 37, 35, 37, 32, 36, 43, 37, 38, 31, 41, 36, 38, 37, 34, 37, 34, 37, 30, 37, 33, 33, 41, 32, 46, 32, 46, 36, 35, 37, 34, 36, 38, 36, 35, 37, 32, 37, 30, 37, 32, 36, 39, 36, 33, 36, 35, 32, 45, 36, 33, 36, 46, 36, 44, 32, 46, 36, 31, 37, 30, 36, 39]
Below few TOML specs attempted but none of them work. They always fail with data: parameter is empty (common part of the JSON job run shared below):
{
"__typename": "JobRun",
"id": "246",
"allErrors": [
"data: parameter is empty"
],
"createdAt": "2022-10-14T12:31:42.234027Z",
"fatalErrors": [
"data: parameter is empty"
],
"finishedAt": "2022-10-14T12:31:42.236091Z",
"job": {
"__typename": "Job",
"id": "232",
"name": "Test decode CBOR standard",
"observationSource": " decode_cbor [type="cborparse" mode="standard" data=<it_does_not_matter>] "
},
"status": "ERRORED",
"inputs": {
"decode_cbor": {
},
"jobRun": {
"meta": null
}
},
"outputs": [
null
],
"taskRuns": [
{
"__typename": "TaskRun",
"id": "9c374ffb-cf80-41c9-a3b7-08391abd48fa",
"createdAt": "2022-10-14T12:31:42.234993Z",
"dotID": "decode_cbor",
"error": "data: parameter is empty",
"finishedAt": "2022-10-14T12:31:42.236021Z",
"output": "null",
"type": "cborparse"
}
]
}
Test 1: webhook TOML spec where data has an hexStr
data has is a hexStr
type = "webhook"
schemaVersion = 1
name = "Test decode CBOR diet 1"
observationSource = """
decode_cbor [type="cborparse" mode="standard" data="0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"]
"""
I've tried also multiple syntax combinations, adding and removing [ ], 0x, "". For instance:
type = "webhook"
schemaVersion = 1
name = "Test decode CBOR standard 3"
observationSource = """
decode_cbor [type="cborparse" mode="standard" data=<{["0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"]}>]
"""
Test 2: webhook TOML spec where data does not have hexStr
data is <{ ... }>. I've also tried this with scaped quotes (old syntax)
type = "webhook"
schemaVersion = 1
name = "Test decode CBOR standard 1"
observationSource = """
decode_cbor [type="cborparse" mode="standard" data=<{41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 34, 36, 33, 36, 31, 36, 43, 36, 43, 36, 36, 36, 39, 36, 45, 37, 30, 37, 35, 37, 34, 37, 33, 38, 32, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 39, 37, 32, 36, 35, 37, 31, 37, 35, 36, 35, 37, 33, 37, 34, 34, 39, 36, 34, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 37, 36, 32, 37, 39, 37, 34, 36, 35, 37, 33, 33, 33, 33, 32, 41, 34, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 37, 37, 32, 36, 35, 37, 33, 37, 35, 36, 43, 37, 34, 37, 33, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 37, 36, 32, 37, 39, 37, 34, 36, 35, 37, 33, 35, 42, 35, 44, 36, 36, 36, 35, 36, 45, 36, 33, 36, 46, 36, 34, 36, 35, 41, 32, 36, 36, 36, 44, 36, 35, 37, 34, 36, 38, 36, 46, 36, 34, 36, 36, 37, 30, 36, 31, 36, 33, 36, 42, 36, 35, 36, 34, 36, 34, 36, 34, 36, 31, 37, 34, 36, 31, 36, 41, 37, 32, 36, 35, 37, 33, 37, 35, 36, 43, 37, 34, 37, 33, 35, 32, 36, 31, 37, 37, 36, 41, 36, 33, 36, 46, 36, 44, 37, 30, 36, 46, 36, 45, 36, 35, 36, 45, 37, 34, 37, 33, 38, 35, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 36, 36, 37, 36, 31, 36, 44, 36, 35, 34, 39, 36, 34, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 35, 36, 39, 36, 45, 37, 34, 33, 33, 33, 32, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 39, 37, 33, 37, 34, 36, 31, 37, 32, 37, 34, 35, 34, 36, 39, 36, 44, 36, 35, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 35, 36, 39, 36, 45, 37, 34, 33, 34, 33, 30, 41, 34, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 45, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 34, 43, 36, 35, 36, 45, 36, 37, 37, 34, 36, 38, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 35, 37, 35, 36, 39, 36, 45, 37, 34, 33, 38, 36, 36, 36, 44, 36, 35, 37, 34, 36, 38, 36, 46, 36, 34, 36, 36, 36, 43, 36, 35, 36, 45, 36, 37, 37, 34, 36, 38, 36, 34, 36, 34, 36, 31, 37, 34, 36, 31, 36, 38, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 38, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 33, 37, 34, 37, 32, 36, 39, 36}>]
"""
data is <{[ ... ]}>. I've also tried this with scaped quotes (old syntax)
type = "webhook"
schemaVersion = 1
name = "Test decode CBOR standard 2"
observationSource = """
decode_cbor [type="cborparse" mode="standard" data=<{[41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 34, 36, 33, 36, 31, 36, 43, 36, 43, 36, 36, 36, 39, 36, 45, 37, 30, 37, 35, 37, 34, 37, 33, 38, 32, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 39, 37, 32, 36, 35, 37, 31, 37, 35, 36, 35, 37, 33, 37, 34, 34, 39, 36, 34, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 37, 36, 32, 37, 39, 37, 34, 36, 35, 37, 33, 33, 33, 33, 32, 41, 34, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 37, 37, 32, 36, 35, 37, 33, 37, 35, 36, 43, 37, 34, 37, 33, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 37, 36, 32, 37, 39, 37, 34, 36, 35, 37, 33, 35, 42, 35, 44, 36, 36, 36, 35, 36, 45, 36, 33, 36, 46, 36, 34, 36, 35, 41, 32, 36, 36, 36, 44, 36, 35, 37, 34, 36, 38, 36, 46, 36, 34, 36, 36, 37, 30, 36, 31, 36, 33, 36, 42, 36, 35, 36, 34, 36, 34, 36, 34, 36, 31, 37, 34, 36, 31, 36, 41, 37, 32, 36, 35, 37, 33, 37, 35, 36, 43, 37, 34, 37, 33, 35, 32, 36, 31, 37, 37, 36, 41, 36, 33, 36, 46, 36, 44, 37, 30, 36, 46, 36, 45, 36, 35, 36, 45, 37, 34, 37, 33, 38, 35, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 36, 36, 37, 36, 31, 36, 44, 36, 35, 34, 39, 36, 34, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 35, 36, 39, 36, 45, 37, 34, 33, 33, 33, 32, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 39, 37, 33, 37, 34, 36, 31, 37, 32, 37, 34, 35, 34, 36, 39, 36, 44, 36, 35, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 35, 36, 39, 36, 45, 37, 34, 33, 34, 33, 30, 41, 34, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 45, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 34, 43, 36, 35, 36, 45, 36, 37, 37, 34, 36, 38, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 35, 37, 35, 36, 39, 36, 45, 37, 34, 33, 38, 36, 36, 36, 44, 36, 35, 37, 34, 36, 38, 36, 46, 36, 34, 36, 36, 36, 43, 36, 35, 36, 45, 36, 37, 37, 34, 36, 38, 36, 34, 36, 34, 36, 31, 37, 34, 36, 31, 36, 38, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 41, 32, 36, 34, 36, 45, 36, 31, 36, 44, 36, 35, 36, 38, 36, 38, 36, 46, 36, 44, 36, 35, 35, 34, 36, 35, 36, 31, 36, 44, 36, 34, 37, 34, 37, 39, 37, 30, 36, 35, 36, 36, 37, 33, 37, 34, 37, 32, 36, 39, 36]}>]
""
Summary
Did I get wrong how this task is used and its purpose?
May be the standard mode just return straight data?, but why I'm always getting data parameters is empty?
One alternative for me to understand better what's going on would be implementing a unit test in task.cborparse_test.go, but may be someone has the answer!
Thanks!
When using mode=standard, can actually skip the character <{[.
So you can specify the value of data in the TOML as the hex string
decode_cbor [type="cborparse" mode="standard" data="0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"]
or
reference it from a variable like $(foo).
Give that a shot and let me know if you've had trouble.
Also, not sure you need the merge task :
merge [ type="merge" left=<{"input": "0x"}> right=<{"input": "0xA264706174688266726563656E74637573646375726C781A68747470733A2F2F657468657270726963652E636F6D2F617069"}>]
Hope this helps.
Related
doubly array from a stream of integers
how to convert Flux<List> into Flux<int[][]>. I have a Flux<List> -> {1,2,3,.....100} I want to group them by 30 numbers -> [[1,2,3,.....30], [31,32....60],[61.....100]] I have tried the below approach but was not successful. elements are getting grouped in batches of 5 [ [1,2,3,4,5], [6,7,8,9,10],.....] Flux<int[][]> groupedData = fluxData.map(x -> { int outerArraySize = (int) Math.ceil(x.size() / 30) +1; System.out.println(outerArraySize); int[][] boxedData = new int[30][outerArraySize]; AtomicInteger innerArray = new AtomicInteger(0); AtomicInteger outerArray = new AtomicInteger(0); x.forEach(ids -> { boxedData[innerArray.get()][outerArray.get()] = ids; innerArray.getAndIncrement(); if (innerArray.get() == 30) { innerArray.set(0); outerArray.getAndIncrement(); } });
Flux has a useful operator called 'buffer', we can use it to batch the List of Integers. I have created my 'fluxData' like this, just so I can test my code: List<Integer> list1 = IntStream.rangeClosed(1, 100).boxed().collect(Collectors.toList()); List<Integer> list2 = IntStream.rangeClosed(1, 40).boxed().collect(Collectors.toList()); List<Integer> list3 = IntStream.rangeClosed(1, 70).boxed().collect(Collectors.toList()); Flux<List<Integer>> fluxData = Flux.just(list1, list2, list3); Now, we can do the following: fluxData.map(integersList -> { List<List<Integer>> batchesList = Flux.fromStream(integersList.stream()) .buffer(30) // This the magic. .collectList() .block(); // List<List<Integer>> --> int[][] int[][] batchesArray = new int[batchesList.size()][]; for(int i = 0;i < batchesArray.length;i++){ batchesArray[i] = new int[batchesList.get(i).size()]; for (int j = 0; j < batchesArray[i].length; j++) { batchesArray[i][j] = batchesList.get(i).get(j); } } return batchesArray; }) .subscribe(batchesArray -> System.out.println(Arrays.deepToString(batchesArray))); Output: [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]] [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40]] [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67, 68, 69, 70]]
Print ASCII table without loop
I just had an interview and I have been asked a question: How would you print all the ASCII table characters without using a loop. The language doesn't matter.
The only method for doing so that comes to my mind is by using recursion instead of loops. An algorithm for doing this will be something like: void printASCII(int i){ if(i == 128) return; print(i + " " + ((char)i) + "\n"); printASCII(i + 1); } You should call the previous function using: printASCII(0); This will print the complete ASCII table, where each line contains the index followed by a space and the actual ASCII character. I don't think you can find any other way to do so, specially that it clearly says: The language doesn't matter This usually means that the question is about an algorithmic idea, rather than being specific for any language.
Two other approaches that weren't mentioned: The obvious: #include <stdio.h> int main() { printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127); } The power of two tree (probably intended by the interviewer): #include <stdio.h> int c; #define a128 a64; a64; #define a64 a32; a32; #define a32 a16; a16; #define a16 a8; a8; #define a8 a4; a4; #define a4 a2; a2; #define a2 a; a; #define a printf("%c", c++); int main() { c = 0; a128 }
Faster way for randomly chosing a value from list and deleting the chosen value
I was wondering if there is a faster way to randomly choose a value from a list and deleting this value from this list so it cannot be chosen again. This drawing of a value will continue until there aint no values left anymore. The way I did it soved the problem but it takes almost 8 seconds. So I'm wondering if there is a faster way. I am using Jupyter notebook through the Anaconda software. Since this goes through a server, could it be the problem? This is what I did: TotalNumbcol = 266 Column_Numbers = list(np.arange(1,TotalNumbcol+1,1)) # creating a list with all column numbers in it from which can be drawn. #print Column_Numbers ABC = Column_Numbers # Creating a variable for the len command in the for loop below, since the Column Numbers length will change. Chosen_Columns = [[0] for i in range(0,len(Column_Numbers))] for i in range(len(ABC)): RandChoiceCol = int(random.choice(Column_Numbers)) # chosing a random number from the Column_Numbers range Chosen_Columns[i]=(RandChoiceCol) # adding each randomly chosen column number to a list in list showing which column has been chosen. Column_Numbers = [x for x in Column_Numbers if x not in Chosen_Columns] # delete chosen_column from RandChoiceCol print Chosen_Columns print Column_Numbers [21, 131, 145, 218, 153, 60, 201, 15, 158, 189, 230, 210, 18, 103, 69, 76, 226, 180, 67, 187, 238, 20, 157, 24, 48, 11, 47, 117, 101, 51, 122, 155, 109, 225, 86, 243, 146, 30, 58, 7, 66, 132, 22, 110, 1, 142, 234, 245, 266, 129, 232, 39, 184, 49, 114, 182, 162, 144, 92, 126, 5, 254, 150, 102, 135, 173, 36, 52, 42, 26, 228, 63, 17, 8, 163, 40, 78, 174, 222, 205, 183, 140, 221, 70, 125, 72, 247, 237, 64, 246, 185, 130, 248, 90, 197, 53, 107, 77, 108, 256, 207, 139, 176, 192, 2, 164, 4, 124, 241, 113, 188, 178, 235, 265, 190, 212, 99, 175, 79, 231, 257, 202, 50, 242, 181, 46, 161, 133, 104, 28, 251, 213, 204, 59, 149, 252, 179, 43, 137, 195, 160, 220, 119, 74, 87, 255, 98, 208, 105, 239, 170, 203, 167, 136, 250, 134, 32, 165, 229, 9, 258, 13, 141, 240, 262, 34, 227, 148, 41, 111, 54, 71, 61, 94, 249, 29, 75, 10, 193, 152, 73, 123, 65, 6, 116, 68, 91, 56, 25, 233, 156, 261, 35, 171, 211, 215, 186, 154, 138, 200, 44, 112, 57, 166, 120, 147, 89, 31, 106, 118, 199, 198, 81, 223, 83, 12, 214, 45, 121, 244, 95, 168, 55, 37, 206, 263, 93, 196, 115, 169, 217, 236, 82, 143, 96, 33, 209, 14, 100, 216, 128, 259, 219, 151, 16, 177, 159, 23, 38, 84, 80, 27, 19, 264, 62, 85, 127, 97, 224, 172, 191, 88, 253, 3, 260, 194] [] If there is a more efficient way saving time please let me know. Regards,
You may just shuffle the list in place instead of creating a new list and a new number every time: Column_Numbers = list(np.arange(1,TotalNumbcol+1,1)) random.shuffle(Column_Numbers) while Column_Numbers: rand = Column_Numbers.pop() print(rand)
byte[] image is not renderer correctly by HttpServlet
I've got this piece of coding which, when displayed in Firefox or Chrome, throws an exception (the image cannot be displayed because it contains errors). byte[] img2 = { 105, 86, 66, 79, 82, 119, 48, 75, 71, 103, 111, 65, 65, 65, 65, 78, 83, 85, 104, 69, 85, 103, 65, 65, 65, 68, 65, 65, 65, 65, 65, 101, 67, 65, 89, 65, 65, 65, 66, 113, 112, 74, 51, 66, 65, 65, 65, 65, 71, 88, 82, 70, 87, 72, 82, 84, 98, 50, 90, 48, 100, 50, 70, 121, 90, 81, 66, 66, 90, 71, 57, 105, 90, 83, 66, 74, 98, 87, 70, 110, 90, 86, 74, 108, 89, 87, 82, 53, 99, 99, 108, 108, 80, 65, 65, 65, 65, 50, 112, 74, 82, 69, 70, 85, 101, 78, 114, 115, 87, 69, 49, 73, 86, 71, 69, 85, 118, 102, 54, 107, 111, 87, 108, 69, 97, 101, 85, 89, 113, 73, 115, 89, 85, 55, 82, 78, 106, 107, 81, 104, 87, 81, 109, 90, 103, 90, 67, 103, 76, 105, 113, 85, 119, 69, 88, 89, 72, 119, 81, 117, 99, 117, 85, 109, 107, 66, 90, 87, 71, 122, 99, 87, 69, 112, 82, 85, 71, 66, 81, 73, 47, 85, 99, 82, 97, 89, 69, 74, 97, 111, 71, 107, 107, 87, 78, 81, 75, 108, 79, 97, 83, 85, 111, 47, 99, 57, 53, 52, 72, 47, 102, 55, 51, 110, 115, 122, 85, 113, 115, 72, 99, 43, 69, 78, 56, 55, 53, 53, 99, 57, 56, 57, 53, 53, 53, 55, 118, 106, 99, 84, 107, 49, 86, 53, 113, 88, 57, 76, 57, 114, 113, 116, 113, 99, 109, 74, 53, 75, 97, 89, 109, 102, 116, 74, 119, 50, 78, 84, 98, 54, 106, 56, 49, 80, 85, 47, 98, 103, 51, 85, 72, 117, 115, 50, 53, 109, 87, 103, 57, 108, 104, 121, 101, 85, 81, 66, 82, 65, 72, 56, 90, 56, 84, 106, 53, 102, 102, 67, 78, 49, 111, 77, 68, 78, 107, 106, 84, 69, 105, 108, 70, 87, 118, 121, 76, 101, 116, 66, 67, 122, 79, 115, 106, 67, 78, 111, 120, 101, 84, 47, 77, 109, 116, 90, 107, 121, 97, 66, 122, 43, 55, 49, 106, 116, 72, 69, 53, 75, 121, 53, 53, 107, 108, 76, 111, 84, 74, 102, 78, 117, 108, 109, 115, 109, 83, 84, 121, 115, 65, 105, 110, 121, 48, 65, 120, 75, 43, 53, 99, 90, 111, 102, 55, 54, 70, 53, 102, 52, 47, 108, 111, 114, 81, 57, 51, 90, 83, 52, 102, 114, 117, 83, 102, 80, 47, 112, 76, 105, 88, 53, 115, 47, 90, 68, 49, 78, 76, 120, 110, 70, 52, 79, 84, 112, 106, 114, 65, 49, 101, 80, 109, 116, 101, 51, 100, 98, 50, 105, 106, 106, 115, 68, 116, 105, 84, 100, 101, 117, 121, 104, 97, 121, 50, 86, 121, 108, 112, 116, 56, 50, 48, 70, 65, 71, 75, 115, 43, 53, 105, 57, 104, 71, 73, 84, 86, 108, 78, 83, 84, 106, 87, 116, 76, 98, 108, 67, 71, 121, 116, 102, 85, 50, 66, 86, 117, 88, 75, 82, 68, 117, 114, 109, 111, 51, 102, 75, 79, 84, 79, 111, 77, 56, 97, 115, 78, 112, 122, 114, 99, 83, 119, 101, 85, 90, 122, 118, 85, 99, 55, 82, 74, 98, 49, 52, 55, 110, 114, 69, 71, 89, 104, 76, 51, 107, 82, 120, 66, 97, 49, 48, 47, 79, 107, 82, 43, 114, 54, 52, 48, 108, 104, 98, 68, 65, 120, 113, 106, 75, 107, 65, 84, 108, 81, 88, 109, 85, 120, 76, 43, 84, 66, 89, 50, 82, 87, 65, 113, 106, 57, 81, 83, 67, 100, 114, 105, 113, 105, 113, 49, 71, 117, 99, 81, 48, 89, 121, 76, 116, 43, 49, 66, 50, 115, 72, 73, 78, 55, 117, 81, 116, 122, 56, 47, 89, 47, 78, 81, 82, 67, 72, 54, 85, 74, 74, 74, 57, 72, 110, 70, 48, 111, 83, 109, 81, 106, 115, 90, 97, 97, 110, 75, 69, 86, 75, 65, 70, 76, 118, 105, 79, 98, 54, 72, 85, 98, 104, 72, 75, 50, 78, 75, 110, 68, 77, 107, 90, 54, 76, 111, 51, 100, 111, 81, 118, 108, 117, 87, 66, 99, 113, 122, 115, 43, 103, 107, 97, 56, 98, 68, 66, 68, 111, 66, 72, 100, 66, 90, 43, 102, 103, 76, 113, 57, 53, 89, 120, 107, 54, 113, 120, 121, 89, 69, 49, 50, 67, 99, 111, 68, 98, 117, 118, 113, 85, 100, 83, 109, 118, 90, 85, 109, 73, 119, 53, 99, 88, 43, 105, 74, 65, 100, 65, 121, 88, 109, 67, 52, 70, 102, 88, 75, 65, 101, 87, 90, 69, 90, 53, 111, 55, 52, 77, 118, 76, 115, 76, 106, 76, 109, 89, 115, 80, 97, 87, 100, 68, 112, 52, 86, 112, 100, 105, 107, 53, 87, 47, 56, 77, 111, 77, 121, 88, 89, 55, 54, 47, 77, 101, 75, 106, 106, 51, 54, 47, 119, 90, 120, 115, 100, 49, 86, 112, 114, 118, 110, 101, 83, 85, 73, 111, 111, 76, 86, 120, 116, 121, 85, 47, 79, 103, 97, 110, 107, 100, 51, 81, 56, 57, 100, 86, 70, 70, 74, 117, 108, 109, 113, 100, 43, 110, 48, 99, 65, 89, 66, 100, 72, 66, 122, 110, 110, 51, 106, 111, 102, 116, 43, 111, 114, 88, 120, 67, 66, 99, 51, 89, 79, 108, 65, 73, 113, 78, 101, 119, 83, 100, 49, 116, 87, 70, 74, 99, 116, 74, 81, 110, 55, 103, 48, 83, 73, 71, 86, 49, 68, 106, 53, 70, 72, 109, 73, 53, 111, 77, 122, 81, 103, 47, 55, 112, 52, 79, 117, 48, 85, 112, 81, 69, 75, 71, 102, 65, 98, 115, 78, 66, 76, 104, 121, 81, 67, 67, 84, 69, 82, 102, 79, 71, 78, 84, 79, 51, 89, 74, 107, 106, 100, 77, 106, 113, 82, 74, 80, 76, 102, 53, 84, 89, 87, 53, 84, 106, 43, 74, 108, 107, 51, 48, 107, 43, 87, 74, 101, 83, 89, 70, 49, 76, 52, 69, 55, 87, 121, 87, 54, 107, 53, 57, 98, 110, 73, 69, 73, 72, 77, 104, 122, 108, 74, 101, 87, 103, 77, 56, 102, 121, 119, 101, 54, 76, 65, 112, 106, 57, 107, 65, 109, 77, 87, 106, 97, 56, 122, 80, 82, 85, 82, 43, 117, 48, 109, 120, 48, 99, 84, 69, 74, 56, 112, 66, 56, 77, 89, 70, 78, 72, 122, 82, 115, 88, 104, 43, 53, 65, 55, 68, 122, 56, 80, 84, 115, 109, 53, 98, 52, 103, 114, 82, 79, 66, 84, 85, 54, 54, 70, 47, 74, 103, 86, 117, 81, 53, 65, 52, 106, 52, 78, 75, 111, 80, 72, 107, 66, 66, 66, 117, 71, 99, 65, 89, 122, 113, 79, 55, 78, 100, 70, 57, 117, 98, 121, 111, 49, 99, 48, 106, 113, 82, 118, 54, 54, 105, 119, 79, 119, 97, 68, 117, 122, 99, 77, 116, 53, 43, 109, 70, 113, 101, 104, 69, 74, 115, 98, 119, 118, 79, 81, 114, 97, 106, 119, 122, 67, 76, 115, 108, 104, 109, 66, 119, 57, 122, 89, 69, 115, 54, 82, 48, 112, 83, 119, 112, 75, 55, 101, 69, 121, 81, 55, 85, 51, 55, 119, 117, 90, 72, 121, 73, 99, 57, 53, 102, 79, 97, 115, 57, 50, 117, 47, 86, 71, 80, 50, 113, 79, 47, 121, 75, 73, 65, 111, 103, 68, 99, 68, 105, 67, 99, 86, 55, 115, 104, 89, 116, 122, 43, 53, 43, 53, 102, 65, 81, 89, 65, 80, 115, 81, 106, 121, 52, 54, 108, 99, 104, 65, 65, 65, 65, 65, 65, 83, 85, 86, 79, 82, 75, 53, 67, 89, 73, 73, 61 }; response.setContentType("image/jpeg"); response.setContentLength(img2.length); response.getOutputStream().write(img2, 0, img2.length); response.getOutputStream().close(); If I embed the same piece in an HTML it all works okay. Can anybody tell me why? <img src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAeCAYAAABqpJ3BAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2pJREFUeNrsWE1IVGEUvf6koWlEaeUYqIsYU7RNjkQhWQmZgZCgLiqUwEXYHwQucuUmkBZWGzcWEpRUGBQI/UcRaYEJaoGkkWNQKlOaSUo/c954H/f73nszUqsHc+EN8755c9895557vjcTk1V5qX9L9rqtqcmJ5KaYmftJw2NTb6j81PU/bg3UHus25mWg9lhyeUQBRAH8Z8Tj5ffCN1oMDNkjTEilFWvyLetBCzOsjCNoxeT/MmtZkyaBz+71jtHE5Ky55klLoTJfNulmsmSTysAiny0AxK+5cZof76F5f4/lorQ93ZS4fruSfP/pLiX5s/ZD1NLxnF4OTpjrA1ePmte3db2ijjsDtiTdeuyhay2Vylpt820FAGKs+5i9hGITVlNSTjWtLblCGytfU2BVuXKRDurmo3fKOTOoM8asNpzrcSweUZzvUc7RJb147nrEGYhL3kRxBa10/OkR+r640lhbDAxqjKkATlQXmUxL+TBY2RWAqj9QSCdriqiq1GucQ0YyLt+1B2sHIN7uQtz8/Y/NQRCH6UJJJ9HnF0oSmQjsZaanKEVKAFLviOb6HUbhHK2NKnDMkZ6Lo3doQvluWBcqzs+gka8bDBDoBHdBZ+fgLq95Yxk6qxyYE12CcoDbuvqUdSmvZUmIw5cX+iJAdAyXmC4FfXKAeWZEZ5o74MvLsLjLmYsPaWdDp4Vpdik5W/8MoMyXY76/MeKjj36/wZxsd1VprvneSUIooLVxtyU/Ogankd3Q89dVFFJulmqd+n0cAYBdHBznn3joft+orXxCBc3YOlAIqNewSd1tWFJctJQn7g0SIGV1Dj5FHmI5oMzQg/7p4Ou0UpQEKGfAbsNBLhyQCCTERfOGNTO3YJkjdMjqRJPLf5TYW5Tj+Jlk30k+WJeSYF1L4E7WyW6k59bnIEIHMhzlJeWgM8fywe6LApj9kAmMWja8zPRUR+u0mx0cTEJ8pB8MYFNHzRsXh+5A7Dz8PTsm5b4grROBTU66F/JgVuQ5A4j4NKoPHkBBBuGcAYzqO7NdF9ubyo1c0jqRv66iwOwaDuzcMt5+mFqehEJsbwvOQrajwzCLslhmBw9zYEs6R0pSwpK7eEyQ7U37wuZHyIc95fOas92u/VGP2qO/yKIAogDcDiCcV7shYtz+5+5fAQYAPsQjy46lchAAAAAASUVORK5CYII="/>
If the byte array is a JPEG, it should start with a standard JPEG signature, but yours doesn't. It's hard to tell what's going on since you didn't provide any information about where these bytes came from, but what you should be looking for is something like this: 255 216 255 224 0 16 74 70 73 70 for the first 9 bytes -- the last 4 of those spell "JFIF" This can vary, but the first two bytes should definitely be FFC0 - start of image What's a mystery is why the base64-encoded image displays correctly. Oh I see now: it's a PNG not a JPEG. Check this answer: PHP : binary image data, checking the image type it should help. There also seems to be something wrong with your conversion since the first bytes of your array are not the same as the first bytes of the base64 png (those are: 0x89, 0x50, 0x4e, or in decimal: 137, 80, 78)
Windows phone 7 hebrew support
I have just downloaded windows phone 7.1 sdk for windows phone 7.5. I have two problems: 1. When i create a new project I doesn't see the option to choose windows phone 7 or 7.5 2. Windows phone 7.5 should be based on Silver light 4 but when I create label at my application and write hebrew words it's backwords. Can I solve the problem at this version?
If you have installed the Mango tools, once you select to create a WP7 application you are prompted on a secondary screen to select whether to target 7.0 or 7.1. Note that the version number of the SDK and tools is 7.1 but phones running Mango are marketed as version 7.5. Note that WP7[.1|5] does not yet currently provide native support for RTL languages. You may find a workaround at http://www.danielmoth.com/Blog/RTL-Arabic-And-Hebrew-Support-For-Windows-Phone-7.aspx
For Windows Phone 7 i wrote a mapping function which maps the Arabic encoding[windows-1256] into default WP7 encoding. public static string ConvertToArabic(string s) { short[] mapping = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 8364, 1662, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 1657, 8249, 338, 1670, 1688, 1672, 1711, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 1705, 8482, 1681, 8250, 339, 8204, 8205, 1722, 160, 1548, 162, 163, 164, 165, 166, 167, 168, 169, 1726, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 1563, 187, 188, 189, 190, 1567, 1729, 1569, 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 215, 1591, 1592, 1593, 1594, 1600, 1601, 1602, 1603, 224, 1604, 226, 1605, 1606, 1607, 1608, 231, 232, 233, 234, 235, 1609, 1610, 238, 239, 1611, 1612, 1613, 1614, 244, 1615, 1616, 247, 1617, 249, 1618, 251, 252, 8206, 8207, 1746 }; string str = string.Empty; for (int ix = 0; ix < s.Length; ++ix) { str = str + (char)mapping[s[ix]]; } return str; } This worked for me well.