在顶点中获取 Blob / String 的大小(以字节为单位)?

Posted

技术标签:

【中文标题】在顶点中获取 Blob / String 的大小(以字节为单位)?【英文标题】:Get size of Blob / String in bytes in apex ? 【发布时间】:2017-10-01 02:02:23 【问题描述】:

我想知道顶点中字符串/blob 的大小。 我发现只是 size() 方法,它返回字符串/blob 中的字符数。 Salesforce 中单个字符的大小是多少? 或者有什么方法可以直接知道字节大小?

【问题讨论】:

你找到正确答案了吗? 【参考方案1】:

在包括 APEX 在内的大多数语言中,一个字符 = 1 个字节,因此您只需要 size() 方法。

Blob b = Blob.valueOf('test');
System.assertEquals(4, b.size());

或者,您可以调用 toString(),并从中获取长度。

String s = b.toString();
System.assertEquals(4, s.length());

我希望这会有所帮助。

【讨论】:

在大多数语言中,字符不是字节。 如上所述,这个答案是绝对不正确的,应该忽略。【参考方案2】:

我认为这里唯一真正的答案是“视情况而定”。为什么你需要知道这个?

String 上的方法如 charAtcodePointAt suggest 可能在内部使用 UTF-16;在这种情况下,每个字符将由 2 或 4 个字节表示,但这很难说是“证明”。

Apex 似乎被翻译成 Java 并在某种形式的 JVM 上运行,而 Java 中的 Strings 是 represented internally as UTF-16,所以这再次表明 Apex 中的字符是 2 或 4 个字节。

任何时候Strings 通过网络发送(例如作为来自@RestResource 注释类的响应),UTF-8 似乎被用作字符编码,这意味着每个字符使用 1 到 4 个字节,取决于它是什么字符。 (见section 2.5 of the Unicode standard。)

但是你真的应该问问自己为什么你认为你的代码需要知道这一点,因为它很可能无关紧要。

【讨论】:

【参考方案3】:

您可以通过以下方式估算字符串大小:

String testString = 'test string';
Blob testBlob = Blob.valueOf(testString);

// below converts blob to hexadecimal representation; four ones and zeros 
// from blob will get converted to single hexadecimal character
String hexString = EncodingUtil.convertToHex(testBlob);

// One byte consists of eight ones and zeros so, one byte consists of two 
// hex characters, hence the number of bytes would be
Integer numOfBytes = hexString.length() / 2;

估计大小的另一种选择是在为字符串变量赋值之前和之后获取堆大小:

String testString;
System.debug(Limits.getHeapSize());
testString = 'testString';
System.debug(Limits.getHeapSize());

两个打印数字之间的差异将是一个字符串在堆上的大小。

请注意,从这些方法获得的值会有所不同。我们不知道在 Salesforce 堆中存储字符串或将字符串转换为 blob 时使用什么类型的编码。

【讨论】:

以上是关于在顶点中获取 Blob / String 的大小(以字节为单位)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取像素着色器版本和顶点着色器版本

如何使用用户定义的函数获取 cassandra 的 blob 列的大小?

GLSL 每个顶点固定大小的数组

如何在 Azure blob 下载中获取 blob 下载进度

在PostgreSQL查询中获取大对象的大小?

如何限制 ASA 输出中的 blob 存储文件大小