相关文章推荐
乖乖的冲锋衣  ·  HMAC-SHA256和RSA-SHA256 ...·  1 年前    · 

首先说下差异,java中byte是短整形,是有符号的,而golang中的byte其实是uint8,是无符号的int8

再说说怎么遇到这个坑的。

因为工作的问题需要把一段java加密程序用golang实现,其中一个方法是将java的long类型值进行“&”运算和“>>”偏移。
以下是java方法的截图。


很简单吧,我依样画葫芦写了一个golang的方法
这是我的golang方法


原以为大功告成,谁知道运算出的结果不一样,这是运算对比的截图(左边java,右边golang)


一开始我以为是“&”运算的问题,疯狂查资料(查了大概2小时),然而java和golang的官法资料都显示关于“&”运算它们的运算逻辑都是一样的。

我留意到计算中的正负值的问题。心想,同样的int值怎么会计算出的值有正有负呢,问题应该不是出在int上。那么,很可能出在byte上。
官方资料显示,java中byte是短整形,是有符号的,而golang中的byte其实是uint8,是无符号的int8.问题应该出在这里。于是我修改了方法,再次尝试。

一次成功。这是最后的打印结果对比。


打印结果显示本次计算结果一样的。

最后吐槽下,真是坑啊,明明都是byte类型,不同语言中的值竟然不一样。

代码如下: 类型 长度     说明 bool         1      true/false,默认false, 不能把非0值当做true(不用数字代表true/false) byte 1      uint8 别名 rune         4      int32别名。 代表一个unicode code point int/unit            一来所运行的平台,32bit/64bit int8/uint8   1     -128 ~ 127; 0 ~ 255 int16/uint16 2     -32768 ~
本文实例讲述了 golang 语言中for循环语句用法。分享给大家供大家参考。具体分析如下: for循环是用来遍历数组或数字的。用for循环遍历字符串时,也有 byte 和 rune 两种方式.第一种为 byte ,第二种rune. 代码如下:package main import ( “fmt” func main() { s := “abc汉字” for i := 0; i < len(s); i++ { fmt.Printf(“%c,”, s[i]) fmt.println() for _, r := range s { fmt.Printf(“%c,”, r) 输出结果: func canConstruct(ransomNote string, magazine string) bool { if len(ransomNote) == 0 && len(magazine) == 0 || len(ransomNote) == 0 { return true if len(magazine) == 0 { return false dict1 := make(map[rune]int, 0) dict2 := make(map[rune]int, 0) for _, v := range ransomNote {
我先说下场景,数据库定义的长度是VARCHAR2(100),文件数据有一个字段有40个字符,UTF-8编码的非英文字符,如果在插入数据库的时候如果使用String的length()方法去获取长度大小肯定是40.这里40长度肯定是小于数据库大小100,通过了验证,但是插入数据库会出现,值过大。 这里是我说下俩个解决办法: 1.将VARCHAR2(100),字节100,改VARCHAR(C
在C#中 byte 的范围在 [0,255] 所以 java 程序与C#程序 进行数据传输的时候 要先把 java byte 数组转换成在[0,255]范围内的int型数组a[];再把a[]进行加密得到字符串str, 把字符串传到web服务上。 如果已经用C#写好了,关于 byte 数组的逻辑处理,要转成 java 处理的话,需要先对 byte 数组做如下处理: int data[] = new int[ byte s.length]; for(int i...
golang java byte 取值范围不一样 o(╯□╰)o,这里是个 golang 定义如下 // byte is an alias for uint8 and is equivalent to uint8 in all ways. It is // used, by convention, to distinguish byte values from 8-bit unsig
// NetWorkLogger sample network logger type NetWorkLogger struct {} func ( n NetWorkLogger ) Write ( b [] byte ) ( int , error ) { // http.Post("localhost:8080/log", "", byte s.NewReader(b)) http . Get ( "http://127.0.0.1:8080/log" ) glg . Success ( "Requested" )
效果把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如: byte (3) –> “00000011” [] byte {1,2,3} –> “[00000001 00000010 00000011]” “[00000011 10000000]” –> [] byte {0x3, 0x80}开源库 biu实际上我已经将其封装到一个开源库了(biu),其中的一个功能就能
public final String toString() { byte [] row = new byte [width]; StringBuilder result = new StringBuilder(height * (width + 1)); for (int y = 0; y < heigh