## News:

Message to All Guests
NB: Posting URL's See here: Posted URL Change

## Binary to displayable text, any base

Started by ahsat, March 31, 2024, 04:37:00 AM

#### ahsat

I am new here and I don't know the current state of things in the world. I have an algorithm I may want to share, if it is not already been invented elsewhere. I came up with the algorithm in the late 70s.

What is the current state of the art in converting binary to a null terminated string of any base, ie binary to hex, to decimal, or binary?

For example, given a number in rax, the base in rbx, the address of the target string in edi, and a table of digits, ie "0123456789abcdef". Where can I find the best example of assembler code that would convert the value in rax into displayable text.

I am not looking for code that will simply do the function, I already know how to do that. I want to see if I know a better way of doing it. Remember this is converting binary to any base, lets say base 2 to base 60. Base 60 is what the Sumerian's used.

#### Vortex

Hi ahset,

It depends on your expectations, well-optimized routines will require extra work. As a beginning, you can start by studying the functions from masm32.lib :

\masm32\help\masmlib.chm :

QuoteConversions

atodw Convert ascii number to DWORD
htodw Convert HEX string to DWORD
dwtoa Convert DWORD to ascii string
.
.
.

#### jj2007

Quote from: ahsat on March 31, 2024, 04:37:00 AMWhat is the current state of the art in converting binary to a null terminated string of any base, ie binary to hex, to decimal, or binary?

In addition to what Vortex wrote, there are these number to string macros, part of the Masm32 SDK:
`ubyte\$() Unsigned BYTE input sbyte\$() Signed BYTE input xbyte\$() Hex notation output BYTE uword\$() Unsigned WORD input sword\$() Signed WORD input xword\$() Hex notation output WORD udword\$() Unsigned DWORD input sdword\$() Signed DWORD input xdword\$() Hex notation output DWORD uqword\$() Unsigned QWORD input sqword\$() Signed QWORD input xqword\$() Hex notation output QWORD real4\$() 32 bit FLOAT input real8\$() 64 bit FLOAT input real10\$() 80 bit FLOAT input`
MasmBasic offers
Str\$()     input automatically detected (reg32, xmm*, dword, word, byte, ST(0))
Hex\$()   input automatically detected (...)
Bin\$()    input reg32, dword variable, immediate

#### ahsat

Quote from: Vortex on March 31, 2024, 05:53:00 AMatodw Convert ascii number to DWORD
htodw Convert HEX string to DWORD
dwtoa Convert DWORD to ascii string

I am sorry at being so new here, but where can I locate those?

#### Vortex

Hi ahsat,

QuoteI am sorry at being so new here, but where can I locate those?

The location of the source code :

`\masm32\m32lib`

#### NoCforMe

Remember, those (most of them) are all 32-bit code.

I'm sure your binary-to-ASCII routine could easily be rewritten in X86/X64 assembly language. Care to post it here?
Assembly language programming should be fun. That's why I do it.

#### ahsat

Quote from: Vortex on March 31, 2024, 07:47:37 AMThe location of the source code :

I have \masm64\m64lib and it seems not to be there. I will get the 32 bit version.

#### ahsat

Quote from: NoCforMe on March 31, 2024, 08:21:39 AMI'm sure your binary-to-ASCII routine could easily be rewritten in X86/X64 assembly language. Care to post it here?

If my code is a good as I think it is, I will. But I have been out of the coding world for so long, I don't want to look foolish. I want to see the best that is out there first.

#### jj2007

Quote from: ahsat on March 31, 2024, 08:30:04 AMI want to see the best that is out there first

Go to forum search and try e.g. fast hex

Btw instead of chasing the fastest bintostring algo, you might simply use them for some more ambitious project of yours.

#### ahsat

Quote from: jj2007 on March 31, 2024, 08:43:46 AMsome more ambitious project of yours

I'm too old for anything ambitious.

#### jj2007

Quote from: ahsat on March 31, 2024, 09:20:49 AMI'm too old for anything ambitious.

Beating the algos in the Laboratory is extremely ambitious

#### NoCforMe

Quote from: ahsat on March 31, 2024, 08:30:04 AM
Quote from: NoCforMe on March 31, 2024, 08:21:39 AMI'm sure your binary-to-ASCII routine could easily be rewritten in X86/X64 assembly language. Care to post it here?

If my code is a good as I think it is, I will. But I have been out of the coding world for so long, I don't want to look foolish. I want to see the best that is out there first.

I, for one, would be curious to see what you have. No need to worry about looking foolish: we're not judgemental like that here. (If there are obvious flaws in your code someone might point them out.) Always interesting to see someone's take on how to perform some function, especially if it was conceived some number of years ago.

And so far as performance goes, I've been driving the same nail here for some time: it really doesn't make any difference how fast such routines are, at least in most applications. Let's say you're using such a routine to convert display user output in a Windows console program: the time it takes to actually display the text completely swamps whatever time it takes to do the conversion.

Now if your code is super-adaptable, can produce output in any radix (base), then that would be something ...
Assembly language programming should be fun. That's why I do it.

#### ahsat

Quote from: NoCforMe on March 31, 2024, 10:10:38 AMoutput in any radix (base), then that would be something

The code can produce output in any base, I currently have a test program that supports base 2 to base 60. The only thing that limits the base is the characters available to represent the digits. I am currently using

'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkylmnopqrstuvw'

as the digits. Does that meet your definition of a radix (base)?

I also understand you to be saying that you know of nothing like this existing now, is that correct.

#### ahsat

Quote from: jj2007 on March 31, 2024, 09:45:05 AMBeating the algos in the Laboratory is extremely ambitious

I think I have been doing that all my life.