美文网首页
golang实现java uuid的序列化

golang实现java uuid的序列化

作者: EasyNetCN | 来源:发表于2020-09-20 10:38 被阅读0次

    目前只实现了java生成的固定的uuid:85bb94b8-fd4b-4e1c-8f49-3cedd49d8f28的序列化

    package main
    
    import (
        "encoding/binary"
        "encoding/json"
        "fmt"
        "log"
        "os"
        "strings"
        "time"
    
        "github.com/Shopify/sarama"
        "github.com/google/uuid"
    )
    
    const (
        DATE_TIME_PATTERN = ""
        STREAM_MAGIC      = 0xaced
        STREAM_VERSION    = 5
        TC_STRING         = 0x74
        TC_OBJECT         = 0x73
        TC_CLASSDESC      = 0x72
        SC_SERIALIZABLE   = 0x02
        TC_ENDBLOCKDATA   = 0x78
        TC_NULL           = 0x70
    )
    
    func main() {
        uuidTest()
    }
    
    func uuidTest() {
        f, _ := os.Create("uuid-go.out")
        defer f.Close()
    
        f.Write(ShortBytes(STREAM_MAGIC))
        f.Write(ShortBytes(STREAM_VERSION))
        f.Write([]byte{TC_OBJECT})
        f.Write([]byte{TC_CLASSDESC})
    
        className := "java.util.UUID"
        classNameLen := len(className)
    
        f.Write(ShortBytes(uint16(classNameLen)))
        f.Write([]byte(className))
    
        sid := -4856846361193249489
    
        f.Write(LongBytes(uint64(sid)))
    
        //flags
        f.Write([]byte{2})
    
        //fields length
        f.Write(ShortBytes(2))
    
        //field type code
        f.Write([]byte{'J'})
    
        f1 := "leastSigBits"
        f1Len := len(f1)
    
        f.Write(ShortBytes(uint16(f1Len)))
        f.Write([]byte(f1))
    
        //filed type code
        f.Write([]byte{'J'})
    
        f2 := "mostSigBits"
        f2Len := len(f2)
    
        f.Write(ShortBytes(uint16(f2Len)))
        f.Write([]byte(f2))
    
        f.Write([]byte{TC_ENDBLOCKDATA})
        f.Write([]byte{TC_NULL})
    
        leastSigBits := -8121893460813967576
    
        f.Write(LongBytes(uint64(leastSigBits)))
    
        mostSigBits := -8810284723775779300
    
        f.Write(LongBytes(uint64(mostSigBits)))
    
    }
    
    func ShortBytes(i uint16) []byte {
        bytes := make([]byte, 2)
    
        binary.BigEndian.PutUint16(bytes, i)
    
        return bytes
    }
    
    func LongBytes(i uint64) []byte {
        bytes := make([]byte, 8)
    
        binary.BigEndian.PutUint64(bytes, i)
    
        return bytes
    }
    
    func BigEndian() { // 大端序
        // 二进制形式:0000 0000 0000 0000 0001 0002 0003 0004
        var testInt int32 = 0x01020304 // 十六进制表示
        fmt.Printf("%d use big endian: \n", testInt)
    
        var testBytes []byte = make([]byte, 4)
        binary.BigEndian.PutUint32(testBytes, uint32(testInt)) //大端序模式
        fmt.Println("int32 to bytes:", testBytes)
    
        convInt := binary.BigEndian.Uint32(testBytes) //大端序模式的字节转为int32
        fmt.Printf("bytes to int32: %d\n\n", convInt)
    }
    
    func LittleEndian() { // 小端序
        //二进制形式: 0000 0000 0000 0000 0001 0002 0003 0004
        var testInt int32 = 0x01020304 // 16进制
        fmt.Printf("%d use little endian: \n", testInt)
    
        var testBytes []byte = make([]byte, 4)
        binary.LittleEndian.PutUint32(testBytes, uint32(testInt)) //小端序模式
        fmt.Println("int32 to bytes:", testBytes)
    
        convInt := binary.LittleEndian.Uint32(testBytes) //小端序模式的字节转换
        fmt.Printf("bytes to int32: %d\n\n", convInt)
    }
    
    func Int64ToBytes(i int64) []byte {
        var buf = make([]byte, 8)
        binary.BigEndian.PutUint64(buf, uint64(i))
        return buf
    }
    

    java读取测试

    public class Test {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            readUUIDTest();
        }
    
        private static void readUUIDTest() throws IOException, ClassNotFoundException {
            try (var fis = new FileInputStream("uuid-go.out"); var is = new ObjectInputStream(fis)) {
                var uuid = is.readObject();
    
                System.out.print(uuid);
    
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:golang实现java uuid的序列化

          本文链接:https://www.haomeiwen.com/subject/uymuyktx.html