<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sv">
	<id>http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Base32</id>
	<title>Base32 - Versionshistorik</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.sikvall.se/index.php?action=history&amp;feed=atom&amp;title=Base32"/>
	<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base32&amp;action=history"/>
	<updated>2026-04-19T10:14:57Z</updated>
	<subtitle>Versionshistorik för denna sida på wikin</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://wiki.sikvall.se/index.php?title=Base32&amp;diff=1565&amp;oldid=prev</id>
		<title>Anders: Skapade sidan med &#039;För bakgrundsinformation se Base64.   = Implementation =  = C =   &lt;pre&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt;  // BASE32 kodningstabell static const char base32_table[] = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ234567&quot;;  // Funktion för BASE32 kodning char* base32_encode(const unsigned char* input, size_t length) {     // Beräkna utdatalängd: 8 tecken för varje 5 bytes     size_t output_length = 8 * ((length + 4) / 5);     char* encoded = malloc(output_l...&#039;</title>
		<link rel="alternate" type="text/html" href="http://wiki.sikvall.se/index.php?title=Base32&amp;diff=1565&amp;oldid=prev"/>
		<updated>2025-02-22T01:14:29Z</updated>

		<summary type="html">&lt;p&gt;Skapade sidan med &amp;#039;För bakgrundsinformation se &lt;a href=&quot;/index.php/Base64&quot; title=&quot;Base64&quot;&gt;Base64&lt;/a&gt;.   = Implementation =  = C =   &amp;lt;pre&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt;  // BASE32 kodningstabell static const char base32_table[] = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ234567&amp;quot;;  // Funktion för BASE32 kodning char* base32_encode(const unsigned char* input, size_t length) {     // Beräkna utdatalängd: 8 tecken för varje 5 bytes     size_t output_length = 8 * ((length + 4) / 5);     char* encoded = malloc(output_l...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny sida&lt;/b&gt;&lt;/p&gt;&lt;div&gt;För bakgrundsinformation se [[Base64]]. &lt;br /&gt;
&lt;br /&gt;
= Implementation =&lt;br /&gt;
&lt;br /&gt;
= C = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// BASE32 kodningstabell&lt;br /&gt;
static const char base32_table[] = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ234567&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE32 kodning&lt;br /&gt;
char* base32_encode(const unsigned char* input, size_t length) {&lt;br /&gt;
    // Beräkna utdatalängd: 8 tecken för varje 5 bytes&lt;br /&gt;
    size_t output_length = 8 * ((length + 4) / 5);&lt;br /&gt;
    char* encoded = malloc(output_length + 1);&lt;br /&gt;
    if (encoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    size_t i = 0, j = 0;&lt;br /&gt;
    unsigned long buffer = 0;&lt;br /&gt;
    int bits_left = 0;&lt;br /&gt;
    &lt;br /&gt;
    while (i &amp;lt; length || bits_left &amp;gt; 0) {&lt;br /&gt;
        // Fyll buffert med upp till 5 bytes&lt;br /&gt;
        if (bits_left &amp;lt; 5 &amp;amp;&amp;amp; i &amp;lt; length) {&lt;br /&gt;
            buffer = (buffer &amp;lt;&amp;lt; 8) | input[i++];&lt;br /&gt;
            bits_left += 8;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Om vi har minst 5 bitar, ta ut ett BASE32-tecken&lt;br /&gt;
        if (bits_left &amp;gt;= 5) {&lt;br /&gt;
            int value = (buffer &amp;gt;&amp;gt; (bits_left - 5)) &amp;amp; 0x1F;&lt;br /&gt;
            encoded[j++] = base32_table[value];&lt;br /&gt;
            bits_left -= 5;&lt;br /&gt;
        } else if (i &amp;gt;= length) {&lt;br /&gt;
            // Padding för sista gruppen&lt;br /&gt;
            encoded[j++] = &amp;#039;=&amp;#039;;&lt;br /&gt;
            bits_left = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Fyll på med padding till multipel av 8&lt;br /&gt;
    while (j % 8 != 0) {&lt;br /&gt;
        encoded[j++] = &amp;#039;=&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    encoded[j] = &amp;#039;\0&amp;#039;;&lt;br /&gt;
    return encoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Funktion för BASE32 avkodning&lt;br /&gt;
unsigned char* base32_decode(const char* input, size_t* output_length) {&lt;br /&gt;
    size_t input_length = strlen(input);&lt;br /&gt;
    if (input_length % 8 != 0) return NULL; // BASE32 måste vara multipler av 8&lt;br /&gt;
    &lt;br /&gt;
    // Räkna faktiska databytes (exkludera padding)&lt;br /&gt;
    size_t padding = 0;&lt;br /&gt;
    for (int i = input_length - 1; i &amp;gt;= 0 &amp;amp;&amp;amp; input[i] == &amp;#039;=&amp;#039;; i--) {&lt;br /&gt;
        padding++;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Beräkna utdatalängd&lt;br /&gt;
    *output_length = (input_length * 5) / 8 - padding;&lt;br /&gt;
    unsigned char* decoded = malloc(*output_length);&lt;br /&gt;
    if (decoded == NULL) return NULL;&lt;br /&gt;
    &lt;br /&gt;
    // Skapa lookup-tabell&lt;br /&gt;
    unsigned char decode_table[256] = {0};&lt;br /&gt;
    for (int i = 0; i &amp;lt; 32; i++) {&lt;br /&gt;
        decode_table[(unsigned char)base32_table[i]] = i;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    unsigned long buffer = 0;&lt;br /&gt;
    int bits_left = 0;&lt;br /&gt;
    size_t j = 0;&lt;br /&gt;
    &lt;br /&gt;
    for (size_t i = 0; i &amp;lt; input_length; i++) {&lt;br /&gt;
        if (input[i] == &amp;#039;=&amp;#039;) break;&lt;br /&gt;
        &lt;br /&gt;
        buffer = (buffer &amp;lt;&amp;lt; 5) | decode_table[(unsigned char)input[i]];&lt;br /&gt;
        bits_left += 5;&lt;br /&gt;
        &lt;br /&gt;
        if (bits_left &amp;gt;= 8) {&lt;br /&gt;
            decoded[j++] = (buffer &amp;gt;&amp;gt; (bits_left - 8)) &amp;amp; 0xFF;&lt;br /&gt;
            bits_left -= 8;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return decoded;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Testprogram&lt;br /&gt;
int main() {&lt;br /&gt;
    const char* original = &amp;quot;Hello World!&amp;quot;;&lt;br /&gt;
    size_t input_length = strlen(original);&lt;br /&gt;
    &lt;br /&gt;
    // Kodning&lt;br /&gt;
    char* encoded = base32_encode((const unsigned char*)original, input_length);&lt;br /&gt;
    if (!encoded) {&lt;br /&gt;
        printf(&amp;quot;Kodningsfel\n&amp;quot;);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Avkodning&lt;br /&gt;
    size_t decoded_length;&lt;br /&gt;
    unsigned char* decoded = base32_decode(encoded, &amp;amp;decoded_length);&lt;br /&gt;
    if (!decoded) {&lt;br /&gt;
        printf(&amp;quot;Avkodningsfel\n&amp;quot;);&lt;br /&gt;
        free(encoded);&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Skriv ut resultat&lt;br /&gt;
    printf(&amp;quot;Original: %s\n&amp;quot;, original);&lt;br /&gt;
    printf(&amp;quot;BASE32: %s\n&amp;quot;, encoded);&lt;br /&gt;
    printf(&amp;quot;Decoded: %.*s\n&amp;quot;, (int)decoded_length, decoded);&lt;br /&gt;
    &lt;br /&gt;
    // Frigör minne&lt;br /&gt;
    free(encoded);&lt;br /&gt;
    free(decoded);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Anders</name></author>
	</entry>
</feed>