Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
July 15, 2014 String to int exception | ||||
---|---|---|---|---|
| ||||
Hi :) I made this function to inverse the bytes in intger or T (possible) type... int reverseBytes(T)(T val) { int retVal = 0; static if(is(T == string)) retVal = to!int(val); return (retVal & 0x000000FF) << 24 | (retVal & 0x0000FF00) << 8 | (retVal & 0x00FF0000) >> 8 | (retVal & 0xFF000000) >> 24; } //... writefln("%x", reverseBytes(x"00402030")); //... When I execute this program, I got this exception: std.conv.ConvException@C:\D\dmd2\src\phobos\std\conv.d(1968): Unexpected '@' when converting from type string to type int |
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alexandre | Alexandre:
> return (retVal & 0x000000FF) << 24 |
> (retVal & 0x0000FF00) << 8 |
> (retVal & 0x00FF0000) >> 8 |
> (retVal & 0xFF000000) >> 24;
See also core.bitop.bswap.
Bye,
bearophile
|
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | Thanks, but, when I convert I recive a 'c' in the front of my number...
uint reverseBytes(uint val)
{
import core.bitop : bitswap;
return bitswap(val);
}
//...
writefln("%x", reverseBytes(0x00402030));
//...
// output: c040200
On Tuesday, 15 July 2014 at 12:16:26 UTC, bearophile wrote:
>
> See also core.bitop.bswap.
>
> Bye,
> bearophile
|
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alexandre | Alexandre:
> Thanks, but, when I convert I recive a 'c' in the front of my number...
This shows it inverts all bits, not just the four byte positions. I don't understand:
import core.bitop: bitswap;
uint reverseBytes(in uint val) pure nothrow @safe @nogc {
return val.bitswap;
}
void main() {
import std.stdio;
immutable uint x = 0x_00_40_20_30U;
immutable uint y = x.reverseBytes;
writefln("%08x", x);
writefln("%032b", x);
writefln("%08x", y);
writefln("%032b", y);
}
Bye,
bearophile
|
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | Something is wrong between our communication... I am wanting to do something better to order the bytes, for this my code... https://gist.github.com/bencz/3576dfc8a217a34c05a9 For example, in that case: injectData(image[0x207], x"30204000"); It's more simple to use something like: injectData(image[0x207], inverseBytes(0x00402030)); On Tuesday, 15 July 2014 at 13:15:34 UTC, bearophile wrote: > Alexandre: > >> Thanks, but, when I convert I recive a 'c' in the front of my number... > > This shows it inverts all bits, not just the four byte positions. I don't understand: > > > import core.bitop: bitswap; > > uint reverseBytes(in uint val) pure nothrow @safe @nogc { > return val.bitswap; > } > > void main() { > import std.stdio; > > immutable uint x = 0x_00_40_20_30U; > immutable uint y = x.reverseBytes; > writefln("%08x", x); > writefln("%032b", x); > writefln("%08x", y); > writefln("%032b", y); > } > > > Bye, > bearophile |
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alexandre | On 07/15/2014 04:56 AM, Alexandre wrote: > retVal = to!int(val); > std.conv.ConvException@C:\D\dmd2\src\phobos\std\conv.d(1968): Unexpected > '@' when converting from type string to type int That means to!int failed because 'val' contained a '@' character in it: import std.conv; void main() { auto s = "42@"; // <-- What is that? auto i = to!int(s); } However, there seems to be a bug in to(). It seems to incorrectly go one character ahead: to!int("mn"); "Unexpected 'n' when converting from type string to type int" to!int("m"); "Unexpected end of input when converting from type string to type int" That is a bug, right? So, in your case the unexpected '@' character may be after another unexpected one: to!int(" @"); "Unexpected '@' when converting from type string to type int" Ali |
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Strange..., why '@' ?
PS: Ali Çehreli, thanks for your book, your book is wonderful!!!
On Tuesday, 15 July 2014 at 13:49:51 UTC, Ali Çehreli wrote:
> On 07/15/2014 04:56 AM, Alexandre wrote:
>
> > retVal = to!int(val);
>
> > std.conv.ConvException@C:\D\dmd2\src\phobos\std\conv.d(1968):
> Unexpected
> > '@' when converting from type string to type int
>
> That means to!int failed because 'val' contained a '@' character in it:
>
> import std.conv;
>
> void main()
> {
> auto s = "42@"; // <-- What is that?
> auto i = to!int(s);
> }
>
> However, there seems to be a bug in to(). It seems to incorrectly go one character ahead:
>
> to!int("mn");
>
> "Unexpected 'n' when converting from type string to type int"
>
> to!int("m");
>
> "Unexpected end of input when converting from type string to type int"
>
> That is a bug, right?
>
> So, in your case the unexpected '@' character may be after another unexpected one:
>
> to!int(" @");
>
> "Unexpected '@' when converting from type string to type int"
>
> Ali
|
July 15, 2014 Re: String to int exception | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alexandre | On Tuesday, 15 July 2014 at 12:24:48 UTC, Alexandre wrote:
> Thanks, but, when I convert I recive a 'c' in the front of my number...
>
> uint reverseBytes(uint val)
> {
> import core.bitop : bitswap;
>
> return bitswap(val);
> }
You confused bswap with bitswap.
The former reverses bytes, the latter reverses bits.
If you look at bearophile's original message he says bswap.
|
Copyright © 1999-2021 by the D Language Foundation