Is there anything better than escape()

S

simplicity

I need to upload the local file to the server site in the environment
where there is no webserver running there, hence no POST method is
available. All I have at the receiving end is the SOAP server which
means that I must send the file as the SOAP message containing textual
representation of bytes, for example:

fileContent = "a b<LF>" must be sent as <data>613262320A</data> where
61 is a hex value of 'a', 32 of SPACE, 62 is 'b', 0A is LF etc

I tried replace() but I am running into a problem of premature end of
array - replace() deals with String types and will do the conversion
to something like "a%32b%0A" (which can be further processed easily to
convert all typable characters by their hex values while stripping %
from non-typable ones) but it will quit on the first accurence of 00
(null) byte and, no need to mention, the binary file will be full of
those.

I can step through the fileContent array one byte at a time and
traverse "special bytes" including null (byte value 0x00) up to the
length of the file I read but I do not know how to determine what
exactly the non-typable characters are, that is I can do mapping

if (content == 'a') concatenate "61" to the SOAP message

but I don't know how I can deal with something like <BEL> character
(byte value 0x07) or any byte value above 0x7F.

Is there a way out of this?
 
T

Thomas 'PointedEars' Lahn

simplicity said:
fileContent = "a b<LF>" must be sent as <data>613262320A</data> where
61 is a hex value of 'a', 32 of SPACE, 62 is 'b', 0A is LF etc

I tried replace() but I am running into a problem of premature end of
array - replace() deals with String types and will do the conversion
to something like "a%32b%0A"

You mean escape(), not String.prototype.replace(). Both methods operate on
string values.

You are looking for String.prototype.replace(), not escape():

fileContent = '<data>'
+ fileContent.replace(
/[\s\S]/g,
function(m)
{
return m.charCodeAt(0).toString(16).toUpperCase();
})
+ '</data>';

Be sure to escape the `</' as `<\/' when in CDATA content.


HTH

PointedEars
 
S

simplicity

I need to upload the local file to the server site in the environment
where there is no webserver running there, hence no POST method is
available. All I have at the receiving end is the SOAP server which
means that I must send the file as the SOAP message containing textual
representation of bytes, for example:

fileContent = "a b<LF>" must be sent as <data>613262320A</data> where
61 is a hex value of 'a', 32 of SPACE, 62 is 'b', 0A is LF etc

I tried replace() but I am running into a problem of premature end of
array - replace() deals with String types and will do the conversion
to something like "a%32b%0A" (which can be further processed easily to
convert all typable characters by their hex values while stripping %
from non-typable ones) but it will quit on the first accurence of 00
(null) byte and, no need to mention, the binary file will be full of
those.

I can step through the fileContent array one byte at a time and
traverse "special bytes" including null (byte value 0x00) up to the
length of the file I read but I do not know how to determine what
exactly the non-typable characters are, that is I can do mapping

if (content == 'a') concatenate "61" to the SOAP message

but I don't know how I can deal with something like <BEL> character
(byte value 0x07) or any byte value above 0x7F.

Is there a way out of this?


Thanks Marc and Thomas

Both code samples work like a charm until... well it is probably my
fault that my description of the problem contained errors and was far
from accurate.

First you both caught the erroneous info correctly: of course I want
to convert my sample bytes "a b<LF>" into <data>6120620A</data>, then
I experimented with escape() not replace().

Second, a big mistake I made was when I claimed that "I can (...)
traverse "special bytes" including null (byte value 0x00)". The truth
is: all of them except null. I guess I missed that fact because I
buried that null (byte value 00) close to the end of the file and lost
the count :-:)-(. The reality is that when I put 00 as a first byte, I
read the length of the file as it truly is (in my case study 32 bytes)
but when I read the file into fileContent and step through fileContent
it interprets fileContent[0] = 0 as end of string and every next
fileContent is also returning 0.

As there are only two data types in javascript, strings and numbers,
is there a trick which would allow me to read the file into the array
of numbers which would remove the "special meaning" from all elements
of value 0"? I know what size the file is before I read it, so
allocating the array of correct size will not be a problem.

Stella
 
T

Thomas 'PointedEars' Lahn

simplicity said:
[...] The reality is that when I put 00 as a first byte, I read the
length of the file as it truly is (in my case study 32 bytes) but when I
read the file into fileContent and step through fileContent it interprets
fileContent[0] = 0 as end of string and every next fileContent is also
returning 0.


See below.
As there are only two data types in javascript, strings and numbers,

You are mistaken. Read any reference on the language to find the contrary
confirmed.
is there a trick which would allow me to read the file into the array of
numbers which would remove the "special meaning" from all elements of
value 0"? I know what size the file is before I read it, so allocating
the array of correct size will not be a problem.

The NUL byte (0x00) denotes the end of a character string of variable length
in many formats (but not in ECMAScript strings). Other than that, I don't
know what your file reading problem is, but there is surely no ECMAScript
data type problem: "\x00".charCodeAt(0).toString(16) returns "0".

Of course, when you have to deal with characters at code points below
U+0010, you will have to pad the returned value with "0" in order to have a
proper byte code. And you will have to exclude characters with code points
above U+00FF, unless your XML parser can deal with Unicode code points:

fileContent = '<data>'
+ fileContent.replace(
/[\s\S]/g,
function(m)
{
var cp = m.charCodeAt(0);

if (cp > 0xFF) return "";

var s = cp.toString(16).toUpperCase();

return (s.length < 1) ? "0" + s : s;
})
+ '</data>';


Reader's time and bandwidth are precious. Please trim your quotes to
the minimum required to retain the context of your reply. See also
http://jibbering.com/faq/ pp.


PointedEars
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top