byte数组的检验和

byte数组的检验和,第1张

类似

public class Test {

public static void main(String args[]) {

byte[] b = new byte[1024];

short s = 0;

// 累加求和

for (int i = 4; i < 1022; i++) {

s += b[i];

}

b[1022] = (byte)((s >> 8) & 0xFF); 

b[1023] = (byte)(s & 0xFF);

}

}

1 、定义数组,要给定其长度,也可以用Type a[ ] = {……} 的方式。

在对数组进行 *** 作时,可能需要计算数组长度,方法是:sizeof(数组名)/sizeof(元素类型)

2、指针指向的字符数组长度的获取方法,不能用sizeof,因为用sizeof(指针),得到指针长度为4

应该用strlen()函数。

#include <iostreamh>

#include <stringh>

int num(char ptr)

{

int bb = strlen(ptr);

return bb;

}

int main()

{

char p= new char[100];

p = "string";

int b = num(p);

cout<<b<<endl;

return 0;

}

使用eclipse默认的vm arguments,运行以下代码:

public static void main(String[] args) {

byte[] array=new byte[61858764];

// short[] shortArray=new short[30929382];

// int[] intArray=new int[15464691];

// long[] longArray=new long[7732345];

}

成功,没有报错,可知在eclipse默认的vm arguments下,byte数组的最大长度是61858764,将近60M。

由于short的长度比byte大一倍,所以short数组的最大长度是30929382,是byte数组最大长度的一半,

以此类推,int数组最大长度是15464691,long数组最大长度是7732345

我以为这就是最终结果,后来突然想起修改虚拟机的最大内存,也是这个结果吗?

我把eclipse的vm arguments设置修改为:-Xms256M -Xmx768M

再次测试代码,发现byte数组的最大长度可以更长,

通过Windows任务管理器可知,运行代码的javawexe进程占用的内存也更大(废话,呵呵)

到此为止,应该可以得出结论,通过修改虚拟机的最大内存,java整型数组的最大长度可以很长,但到底有多长?(肯定比内存小)

我试过定义一个byte数组的长度为618587640,将近600M,没有报错,更长的数组似乎没有意义,我也没有测试。

BYTE array[300]={01,02,05,20};

这样的定义,实际占用内存就是300,数组是不可变长度的内存占用,当声明后内存堆栈的占用是固定的。

至于4,是因为这样的定义后,默认除了前四个字节,后面的296字节默认补了0,那么按照字符串长度的方式计算,后面0不作为有效长度(虽然占用了内存),通过函数strlen取得的长度就是4个字节。

另外注意,数组的不安全性就在于,没有标准函数可以获取数组的实际占用内存长度,因此必须自己记录并限制内存地址 *** 作,否则很容易越界。

一个BYTE就是一个char,同样是一字节,楼上用sizeof(BYTE)得到的数字,只能是1

我做了个测试:

string msg = "我是我是我是我是我是";

Byte[] b = EncodingUnicodeGetBytes(msg);

MemoryStream ms = new MemoryStream(b);

byte[] buffer = new byte[4];

msRead(buffer, 0, (Int32)msLength);

// buffer = EncodingUnicodeGetBytes(msg);

string result = EncodingUnicodeGetString(buffer);

ConsoleWriteLine(result);

ConsoleReadLine();

这个代码就会报错,说数组超过大小。

但是你的那个代码为什么没报错呢因为数组是引用类型;

虽然你 开始 初始化了 长度为4;

但是你后来又写了 buffer= EncodingUnicodeGetBytes(msg);

右边这个是一个长度为20的字节数组,由于byte []是引用类型,他的数据是放在称为“堆”的内存区域中,所以指向了一个新的引用,即EncodingUnicodeGetBytes(msg); 所以即使长度变多了也不会报错。

以上就是关于byte数组的检验和全部的内容,包括:byte数组的检验和、怎么获得一个指向byte数组的指针、Java数组的长度到底能有多大等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10153066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存