2017-06-12 73 views
1

我最近開始在scala中工作,並且需要創建一個MD5的實現。這是我的理解,MD5需要無符號類型,該scala不附帶。由於我將很快開始使用無符號類型的鑿子,我決定實施它的庫。到目前爲止,一切似乎都很好,除非在執行下面的按位操作時,我的F值變爲-271733879,這會導致出現一個錯誤「由於:java.lang.IllegalArgumentException:要求失敗:UInt文本-271733879爲負面」,因爲UInts無法是負面的。鑿子UInt負值錯誤

if(i<16){ 
     F = ((B & C) | ((~B) & D)) 
     g = i 
} 

還有更多的錯誤信息,但它僅僅是不同的庫和類,有因爲這個錯誤的錯誤的跟蹤名單,因此我沒有張貼,因爲我不認爲這很重要。如果是這樣,我可以編輯併發布。

我的B,C和D值等於下面列出的小寫等價物,它是第一次通過for循環,因此它們尚未更新。

var a0 : UInt = UInt(0x67452301) 
var b0 : UInt = UInt(0xefcdab89) 
var c0 : UInt = UInt(0x98badcfe) 
var d0 : UInt = UInt(0x10325476) 

任何幫助將不勝感激。

回答

1

爲了我的回答,我使用鑿子3首選123.U風格來指定文字,而不是鑿子2 UInt(123)風格,但是這個答案適用於任何一種。

有幾種方法,你可以這樣做:

  • 使用斯卡拉龍(放L在字面結束)
    • val myUInt = 0x98badcfeL.U
    • 這顯然將不大於64工作位
  • 使用Scala BigInt
    • val myUInt = BigInt("98badcfe", 16).U
  • 使用鑿的簡寫從字符串構建BigInts
    • val myUInt = "x98badcfe".U
    • 十六進制= X | h,dec = d,oct = o,bin = b